home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 19 / CU Amiga Magazine's Super CD-ROM 19 (1998)(EMAP Images)(GB)[!][issue 1998-02].iso / CUCD / Utilities / Scion / ARexx / Scion2html.rexx < prev    next >
OS/2 REXX Batch file  |  1997-09-24  |  101KB  |  2,609 lines

  1. /* © Harold H. Ipolyi        11 June 1994, 1995, 1996, 1997
  2. =====README=====
  3. Short:    WWW HTML's from Scion Genealogy dbs's
  4. Uploader: ipolyi@pat.mdc.com (Harold H. Ipolyi)
  5. Author:   Harold H. Ipolyi
  6. Type:     util/rexx
  7. LastRev:  30 Mar 1997
  8. _____________________________________________________________________________
  9.  
  10.  to install: just drag Scion2html.rexx & its ICON into REXX:
  11.     however: can be executed from anywhere by double-clicking the ICON
  12. _____________________________________________________________________________
  13. _____________________________________________________________________________
  14.  
  15.  Scion Genealogist © Rob Akins (biz/dbase/Scion.lha) is comprehensive,
  16.  easy to use, and provides Arexx ports for extracting data.
  17. _____________________________________________________________________________
  18.  
  19.  Scion2html.rexx can repeatedly and painlessly recreate HTML files from
  20.  entries in Scion data bases for cross-platform viewing via Mosaic, etc.
  21.  
  22.  Scion2html.rexx can also create AmigaGuide style ".guide" hypertexts
  23. _____________________________________________________________________________
  24.  
  25.  GfxCon © Dirk Farin (gfx/conv/gfxcon.lha) is used to make Thumbnails
  26.  from Scion data base pictures as links to Picture Albums
  27. _____________________________________________________________________________
  28.  
  29.  an interesting example Genealogy is included: see after [Release History]
  30. _____________________________________________________________________________
  31. _____________________________________________________________________________
  32.  
  33. Prerequisites:    Scion V 4.07+ © Rob Akins
  34.         ARexx (of course :)
  35.         rexxsupport.library    ( WB disk:libs     )
  36.         rexxarplib.library    ( aminet:util/rexx )
  37.         HTML/WWW browser (AMosaic, Mosaic, ... )
  38.  
  39.      also:     (to incorporate and display in-line pictures)
  40.         GfxCon V1.7+ © Dirk Farin ( must be in: Sys:Tools)
  41.         Amiga OS 3.0+ for displaying picture datatypes
  42. _____________________________________________________________________________
  43.  
  44.  NOTE: The directory suffix for the AmigaGuide files has changed from A to AG
  45.        Internal links prevent simple renaming of [....]A to [....]AG 
  46. _____________________________________________________________________________
  47.  
  48.  NOTE: Info ( ¶ ) files are no longer preset with <pre><tt>
  49.  
  50.        To allow HTML customization of ( ¶ ) info files, i.e. P{IRN}.DBNAME
  51.        and F{IRN}.DBNAME files, Scion2html.rexx will now remove certain HTML
  52.        tags, <tt></tt><pre></pre><p></p>, when writing guide & text files.
  53.  
  54.        These HTML tags should appear on separate lines
  55. _____________________________________________________________________________
  56.  
  57.      PN{IRN}.DBNAME files are used to generate the ( ¶ ) info files.
  58.  
  59.      PICTURES from [P|F]P{IRN}.DBNAME are links to Picture Albums ( ® )
  60.  
  61.                   (please see PP & FP Notes later)
  62. _____________________________________________________________________________
  63.  
  64.                                     Tested:
  65.  
  66. |¯¯¯¯¯¯¯¯¯¯¯¯¯|    on Amiga3000 Kickstart v.37.175 Workbench v.38.35
  67. |    assume   |    &  Amiga3000 Kickstart v.40.68  Workbench v.40.42
  68. |  TradeMarks |    w/ ScionGenealogist V 3.06 & Mosaic1.2NoNet
  69. |      &      |    w/ ScionGenealogist V 3.13 & Mosaic1.3betaAmitcp
  70. |  CopyRights |    w/ ScionGenealogist V 4.07 & Mosaic2.0Prerelease
  71. |     as      |
  72. | appropriate |    HTML file compatibility tested on: AMosaic, Ibrowse_demo,
  73. |_____________|    HotJava, NCSA Mosaic (Sun), Netscape (Sun), Netscape (Mac)
  74.  
  75.                            _________________________
  76.                           |                         |
  77.                           |          Bugs:          |
  78.   ________________________|_________________________|_________________________
  79.  |                                                                            |
  80.  | Scion2html.rexx only recognizes the first Scion ARexx port name: "SCIONGEN"|
  81.  | If additional copies of Scion are running concurrently, they are ignored.  |
  82.  |____________________________________________________________________________|
  83.  |                                                                            |
  84.  |     If a new Thumbnail format is selected, the user must manually edit     |
  85.  |       the Picture Album files to reflect the new Thumbnail suffixes.       |
  86.  |         _________________________________________________________          |
  87.  |        /  The Picture Album files may have been  User  modified  \         |
  88.  |       ( and must therefore be protected against auto-regeneration )        |
  89.  |____________________________________________________________________________|
  90.  
  91. =====README=====
  92.  
  93. =====History=====
  94.  
  95. Release History:
  96.  
  97.  11 Jun 1994 · ScionToMosaic.rexx for ScionGenealogist V 3.06
  98.  
  99.  19 Jun 1994 · MakeDir(HTMLdir) fixed; extra comments processed.
  100.  
  101.  25 Jun 1994 · Fixed descenders; Women in List italicised
  102.              · updated for ScionGenealogist V 3.13
  103.  
  104.   3 Sep 1994 · Replaces occurrences of "<ScionIRN>" by NAMES from DB
  105.              ·   e.g. Replaces <101> by Iam Onehundredone, Jr.
  106.              · Added Family Info file processing; Ancestor trees
  107.              · Added descendant charts
  108.              · Women italicised; men boldface everywhere
  109.              · Added creation of a textual file "GenealogyOf..."
  110.  
  111.   1 Mar 1995 · cleaned up bugs in creation of textual files
  112.  
  113.   6 Jun 1995 · renamed ScionToMosaic to Scion2html
  114.              ·   (somehow it kept winding up in "music" on AmiNet)
  115.              · date format in "ancestors" section normalized
  116.              · images used as links to picture albums (see
  117.              ·  PP & FP Notes) and links to pictures
  118.              · GfxCon >V1.5 used for picture copying and reducing
  119.              · recoded for DOS/Windows restricted 8.3 file names
  120.  
  121.  26 Jun 1995 · A little comments cleanup after the last changes
  122.              · skip remaking of files when unnecessary
  123.              · another new wrinkle for one of the users:
  124.              ·     special file name prefixes ( GenPrefix )
  125.  
  126.   1 Jul 1995 · added graphics to Ancestors charts
  127.              · allow family picture album sans family info file
  128.              · Thumbnail size now user settable ( at line 3 )
  129.  
  130.   5 Jul 1995 · (more info) » ( ¶ )
  131.              · (family info) » ( ¶ )
  132.              · (Picture Album) » ( ® )
  133.              · (¶) (®) glyphs added to Ancestor, Descendant charts
  134.              · Thumbnail format {GIF|JPEG} now user settable
  135.              ·  ( suffix still .gif in all cases )
  136.  
  137.   1 Aug 1995 · updated for release with ScionGenealogist V 4.07
  138.              · set correct stack size (21000) for GfxCon
  139.              · JPEG now the default Thumbnail format
  140.              ·     (smaller files, no © problems, looks better)
  141.              · changing of configuration added
  142.              · configuration now saved in S:Scion2html.Config
  143.  
  144.  12 Aug 1995 · fix some bugs that creeped in with updated to Scion4.07
  145.              · handling of more of the new ScionV4.07 data fields
  146.              · using CheckForReplacement to create all anchors
  147.              · changed appearance of family & descendant charts
  148.              · configuration is displayed at startup
  149.  
  150.  24 Sep 1995 · ".guide" style hypertext generation added
  151.              ·  Guide picture VIEWER set to MultiView for OS => 3.0
  152.              · person information now in person.[array]
  153.              · initial settings now in flags.[array]
  154.              · verbose flag for extra progress reporting details
  155.              · bold flag for: male «boldface» & female «italic»
  156.              · removed undocumented buggy feature of replacing ocurrences
  157.              ·  of [ScionIRN] (now only replaces ocurrences of <ScionIRN>)
  158.              · fixed a GenPrefix init bug (couldn't reset back to null)
  159.  
  160.   1 Jan 1996 · changed "&" in front of MARRIAGE DATES to "x"
  161.              · Scion2html.Config moved from S: to ENVARC:
  162.              · Scion2html.Config now only stored when changed
  163.              · directory of ".guide" style files changed to [.....]AG
  164.              · option - exclude details on living persons
  165.              ·          ( please use ? for death date when date not known )
  166.              · added textured background ( for IBrowse )
  167.              · no longer forcing all ( ¶ ) info files to <pre><tt>
  168.              · added code to filter <tt> </tt> <pre> </pre> <p> </p>
  169.              ·                      HTML tags from guide & text info files.
  170.              · using INDEX for Guide files (instead of "List of People" )
  171.              · "?" then "t" creates "genealogytemplate.html"
  172.              · "?" then "r" view readme information
  173.              · "?" then "h" review the Release History
  174.              · "?" then "d" to change settings of default parameters
  175.  
  176.   3 Mar 1996 · fix null IRN bug
  177.  
  178.  14 Aug 1996 · fix libs test
  179.  
  180.  30 Jan 1997 · "List of Persons." changed to "Personae"
  181.              · default "Personae" in tables; link to "Personae sans tables"
  182.              ·   don't want tables? then:
  183.              ·       delete file GENEAFIL.htm and then
  184.              ·       rename file GENEAFIN.htm to file GENEAFIL.htm 
  185.  
  186.  30 Mar 1997 · Logic to prevent output for empty data base nodes
  187.              ·
  188.  
  189. =====History=====
  190.  
  191.  ____________________________________________________________________________
  192.  
  193.  (: "uudecode Scion2html.rexx" <- extracts an interesting Genealogy :)
  194.  (:  hint: compare the names of the GreatGrandParents on both sides :)
  195.  
  196.    ( start a shell                  )
  197.    ( cd work:                       ) some work directory
  198.    ( uudecode Rexx:Scion2html.rexx  ) whatever uudecode equiv you use
  199.    ( run Scion Samms                ) load data base into Scion
  200.    ( rx Scion2html.rexx Normal      ) in shell back on WB screen
  201.  
  202.  « the following can be safely left here »
  203.  
  204. begin 755 Samms
  205. M4V-I;VX`-"XP,```3@``%``)```@0P5%9&ET``56:65W``9!1$%-4P`%0T%)U
  206. M3@`%04U%4P`*JU5.2TY/5TZ[``E/3$U35$5!1``&4T%-35,``0`!``(@``(@(
  207. M``(@``(@``(@```!``$!``D&4T%-35,`!U9I<F=I;``"30`!``$``0`6(D9IF
  208. M<G-T($QE;G-M86X@4V%M;7,B``$`*BAD97-C96YD960@9G)O;2!O;FQY(#0@F
  209. M1W)E871'<F%N9%!A<F5N=',I`#A3;VQA<FEA;B!#;W5N8VEL;&]R('P@4')ES
  210. M<VED96YT(&]F('1H92!'86QA8W1I8R!#;W5N8VEL`#]A;&UO<W0M='=I;B!O/
  211. M9B!T=VEN<R`\-CX@)B`\-SXL(&AI<R`B<75A9')U<&QE('-E8V]N9"!C;W5S]
  212. M:6YS(@``````+D-H+C@@;V8@(D9I<G-T($QE;G-M86XB(&)Y($4N($4N(%-M[
  213. M:71H+"!0:"Y$+@`!``$``0`!``$```(``P$``09304U-4P`02F%M97,@06QEN
  214. M>&%N9&5R``)-``$``0`!``$``0`!``$`&V]N;'D@8VAI;&0@;V8@/#@^(&%N/
  215. M9"`\,30^```````N0V@N."!O9B`B1FER<W0@3&5N<VUA;B(@8GD@12X@12X@R
  216. M4VUI=&@L(%!H+D0N``$``0`!``$``0```P`%`0`!"4],35-414%$``9387)AG
  217. M:``"1@`!``$``0`!``$``0`!`!QO;FQY(&-H:6QD(&]F(#PQ,CX@86YD(#PQ+
  218. M,#X``````"Y#:"XX(&]F(")&:7)S="!,96YS;6%N(B!B>2!%+B!%+B!3;6ET:
  219. M:"P@4&@N1"X``0`!``$``0`!```$``8!``()3TQ-4U1%040`!4IO:&X``DT`C
  220. M`0`!``$``0`!``$``0`<;VYL>2!C:&EL9"!O9B`\,3,^(&%N9"`\,3$^````+
  221. M```N0V@N."!O9B`B1FER<W0@3&5N<VUA;B(@8GD@12X@12X@4VUI=&@L(%!H8
  222. M+D0N``$``0`!``$``0``!0`$`0`"!E-!34U3``9)<F5N90`"1@`!``$``0`!]
  223. M``$``0`!`!MO;FQY(&-H:6QD(&]F(#PY/B!A;F0@/#$U/@``````+D-H+C@@^
  224. M;V8@(D9I<G-T($QE;G-M86XB(&)Y($4N($4N(%-M:71H+"!0:"Y$+@`!``$`;
  225. M`0`!``$```8``@`)3TQ-4U1%040`!T=E;W)G90`"30`!``$``0`!``$``0`!C
  226. M`#94=VEN(&)R;W1H97(@;V8@/#<^.R`B<75A9')U<&QE('-E8V]N9"!C;W5SZ
  227. M:6XB(&]F(#PQ/@``````+D-H+C@@;V8@(D9I<G-T($QE;G-M86XB(&)Y($4N5
  228. M($4N(%-M:71H+"!0:"Y$+@`!``$``0`!``$```<``@`)3TQ-4U1%040`!%)A#
  229. M>0`"30`!``$``0`!``$``0`!`#94=VEN(&)R;W1H97(@;V8@/#8^.R`B<75A&
  230. M9')U<&QE('-E8V]N9"!C;W5S:6XB(&]F(#PQ/@``````+D-H+C@@;V8@(D9I@
  231. M<G-T($QE;G-M86XB(&)Y($4N($4N(%-M:71H+"!0:"Y$+@`!``$``0`!``$`8
  232. M``@`!P$``P9304U-4P`%0FEL;``"30`!``$``0`!``$``0`!`#-4=VEN(&)R!
  233. M;W1H97(@;V8@/#D^+"!S:7-T97)S(#PQ,#X@)B`\,3$^(&%R92!T=VEN<P``M
  234. M````&"AN;R!F:7)S="!N86UE(&EN(&)O;VLI``$``0`!``$``0``"0`'`0`$K
  235. M!E-!34U3``57:6QL``)-``$``0`!``$``0`!``$`,U1W:6X@8G)O=&AE<B!OT
  236. M9B`\.#XL('-I<W1E<G,@/#$P/B`F(#PQ,3X@87)E('1W:6YS```````8*&YO8
  237. M(&9I<G-T(&YA;64@:6X@8F]O:RD``0`!``$``0`!```*``<!``4&4T%-35,`7
  238. M!4=I;&P``D8``0`!``$``0`!``$``0`R5'=I;B!S:7-T97(@;V8@/#$Q/BP@G
  239. M8G)O=&AE<G,@/#@^("8@/#D^(&%R92!T=VEN<P``````&"AN;R!F:7)S="!NT
  240. M86UE(&EN(&)O;VLI``$``0`!``$``0``"P`'`0`&!E-!34U3``5*:6QL``)&;
  241. M``$``0`!``$``0`!``$`,E1W:6X@<VES=&5R(&]F(#PQ,#XL(&)R;W1H97)SZ
  242. M(#PX/B`F(#PY/B!A<F4@='=I;G,``````!@H;F\@9FER<W0@;F%M92!I;B!BW
  243. M;V]K*0`!``$``0`!``$```P`"`$`!0E/3$U35$5!1``%2F%C:P`"30`!``$`"
  244. M`0`!``$``0`!`#14=VEN(&)R;W1H97(@;V8@/#$S/BP@<VES=&5R<R`\,30^\
  245. M("8@/#$U/B!A<F4@='=I;G,``````!@H;F\@9FER<W0@;F%M92!I;B!B;V]K;
  246. M*0`!``$``0`!``$```T`"`$`!@E/3$U35$5!1``%36%C:P`"30`!``$``0`!`
  247. M``$``0`!`#14=VEN(&)R;W1H97(@;V8@/#$R/BP@<VES=&5R<R`\,30^("8@?
  248. M/#$U/B!A<F4@='=I;G,``````!@H;F\@9FER<W0@;F%M92!I;B!B;V]K*0`!?
  249. M``$``0`!``$```X`"`$``PE/3$U35$5!1``$1F%Y``)&``$``0`!``$``0`!R
  250. M``$`-%1W:6X@<VES=&5R(&]F(#PQ-3XL(&)R;W1H97)S(#PQ,CX@)B`\,3,^\
  251. M(&%R92!T=VEN<P``````&"AN;R!F:7)S="!N86UE(&EN(&)O;VLI``$``0`!!
  252. M``$``0``#P`(`0`$"4],35-414%$``1-87D``D8``0`!``$``0`!``$``0`TN
  253. M5'=I;B!S:7-T97(@;V8@/#$T/BP@8G)O=&AE<G,@/#$R/B`F(#PQ,SX@87)E>
  254. M('1W:6YS```````8*&YO(&9I<G-T(&YA;64@:6X@8F]O:RD``0`!``$``0`!K
  255. M```0```!``<&4T%-35,`!T%L8F5R=``"30`!``$``0`!``$``0`!``$`````7
  256. M`"Y#:"XX(&]F(")&:7)S="!,96YS;6%N(B!B>2!%+B!%+B!3;6ET:"P@4&@N&
  257. M1"X``0`!``$``0`!```1```!``@)3TQ-4U1%040`"$-H97-T97(``DT``0`!:
  258. M``$``0`!``$``0`!```````N0V@N."!O9B`B1FER<W0@3&5N<VUA;B(@8GD@O
  259. M12X@12X@4VUI=&@L(%!H+D0N``$``0`!``$``0``$@```0`'!D%$04U3``=!B
  260. M9&5L;&4``D8``0`!``$``0`!``$``0`!```````4*&YO="!N86UE9"!I;B!B!
  261. M;V]K*0`!``$``0`!``$``!,```$`"`5#04E.``A#86UI;&QE``)&``$``0`!]
  262. M``$``0`!``$``0``````%"AN;W0@;F%M960@:6X@8F]O:RD``0`!``$``0`!G
  263. M```4``D`!E-!34U3``E6:7)G:6QI80`"1@`!``$``0`!``$``0`!``$`````T
  264. M``$``0`!``$``0`!```!``(``P$``0$``0`!``$```````$``0`!``$``0``7
  265. M`0```@`$``4"``8`!P$``0`!``$```````$``0`!``$``0```0```P`(``X!_
  266. M``(!``$``0`!```````!``$``0`!``$```$```0`"0`/`0`%`0`!``$``0``R
  267. M`````0`!``$``0`!```!```%``P`"@$``P$``0`!``$```````$``0`!``$`M
  268. M`0```0``!@`-``L!``0!``$``0`!```````!``$``0`!``$```$```<`$``28
  269. M!``(``D`"@`+`0`!``$``0```````0`!``$``0`!```!```(`!$`$P0`#``-]
  270. M``X`#P$``0`!``$```````$``0`!``$``0```0``"0`!```!`!0!``$``0`!*
  271. 2```````!``$``0`!``$```$`&
  272. ``
  273. end
  274. size 2988
  275.  
  276.   -----------------------------------------------------------------
  277.  | Conventions that I followed in my ScionGenealogist data base:   |
  278.  |                                                                 |
  279.  | ·  lastnames kept pure (no honorifics, Jr's, III's )            |
  280.  |                                                                 |
  281.  | ·  given names have any and all honorifics AFTER a COMMA        |
  282.  |                                                                 |
  283.  |  for example:  LastName      FirstNames, honorifics             |
  284.  |                                                                 |
  285.  |                BAUER-GAUSS   Joseph, Dr.                        |
  286.  |                DAGLEY        Richard Kelley, Jr.                |
  287.  |                                                                 |
  288.  |-----------------------------------------------------------------|
  289.  |                                                                 |
  290.  |  For a name change (NOT maidenname > marriedname), try this:    |
  291.  |                New           Birth Name > Changed To, Ph. D.    |
  292.  |     which lists as: Birth Name > Changed To New, Ph. D.         |
  293.  |                                                                 |
  294.   -----------------------------------------------------------------
  295. «»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»
  296. »«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«
  297. «»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»
  298. »«                                                                »«
  299. «» GetLastName: PROCEDURE at end of script capitalizes Last Names »«
  300. «» -------------------------------------------------------------  «»
  301. »« | it can also be used to handle "non-conforming" Last Names |  »«
  302. «» |                e.g. "MAC ISAAC" --> "MacISAAC"            |  «»
  303. »« |                     "VON NUEMANN" --> "VonNuemann"        |  »«
  304. «» -------------------------------------------------------------  «»
  305. »« BUT: you must add the additional tests yourself (it's easy!)   »«
  306. «»                                                                «»
  307. «»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»
  308. »«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«
  309. «»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»
  310.  |-----------------------------------------------------------------|
  311.  |                                                                 |
  312.  | · if Death Date is blank; Death Place can be a COMMENT field    |
  313.  |                                            e.g. Phone #         |
  314.  | · if Burial Date is blank; Burial Place can be a COMMENT field  |
  315.  |                                            e.g. Address         |
  316.   -----------------------------------------------------------------
  317.  
  318.  * 'rx Scion2html.rexx Normal' automagically [re]creates a .htm file for
  319.  * each person in your ScionGenealogist data base; following the TEMPLATE:
  320.  
  321. ############ genealogytemplate.html ################
  322. <TITLE>Person Data Sheet</TITLE>
  323. <BODY BGCOLOR="#D0D0D0">
  324. <PRE><TT>
  325. <A href="Person#a.html"><img src="Person#I.jpg"></A>
  326. <B>Person</B> (<A HREF="Person#I.html"> ¶ </A>) (<A href="Person#a.html"><B> ® </B></A>) (<A href="Genealogy/GenealogyFile.html"><B>Personae</B></A>)
  327. Born: birthdate * birthplace <BR>
  328. Died: deathdate + deathplace . Buried: burialplace <BR>
  329. <HR>
  330. <H2>Personae in data base.</H2><P>
  331. <A HREF="Person#.html"><B>malePerson</B></A> * birthdate + deathdate <A HREF="Father.html"><B>Father</B></A> & <A HREF="Mother.html"><I>Mother</I></A><BR>
  332. <A HREF="Person#.html"><I>femalePerson</I></A> * birthdate + deathdate <A HREF="Father.html"><B>Father</B></A> & <A HREF="Mother.html"><I>Mother</I></A><BR>
  333. <HR>
  334. Immediate Family:  ·Parents  ·Sibling  ·Spouse  ·Child
  335.   <A HREF="Father.html"><B>Father</B></A> & <A HREF="Mother.html"><I>Mother</I></A> x mdate @ mplace
  336.   |            (<A HREF="Family#I.html"> ¶ </A>) (<A href="Family#a.html"><B> ® </B></A>)
  337.   |_____ <A HREF="sibling1.html">sibling1</A> * sibling1birthdate + sibling1deathdate
  338.   |_____ <A HREF="siblingN.html">siblingN</A> * siblingNbirthdate + siblingNdeathdate
  339.   |             
  340.   <b>Person</b> & <A HREF="Spouse1.html"><I>Spouse1</I></A> x m1date @ m1place
  341.   |  |  |            (<A HREF="Family#I.html"> ¶ </A>) (<A href="Family#a.html"><B> ® </B></A>)
  342.   |  |  |_____ <A HREF="m1child1.html"><I>m1child1</I></A> * m1child1birthdate + m1child1birthdate
  343.   |  |  |_____ <A HREF="m1childN.html"><B>m1childN</B></A> * m1childNbirthdate + m1childNbirthdate
  344.   |  |
  345.   |  |_& <A HREF="Spouse2.html"><I>Spouse2</I></A> x m2date @ m2place
  346.   |    |            (<A HREF="Family#I.html"> ¶ </A>) (<A href="Family#a.html"><B> ® </B></A>)
  347.   |    |_____ <A HREF="m2child1.html"><B>m2child1</B></A> * m2child1birthdate + m2child1birthdate
  348.   |    |_____ <A HREF="m2childN.html"><I>m2childN</I></A> * m2childNbirthdate + m2child2birthdate
  349.   |
  350.   |_& <A HREF="SpouseN.html"><I>SpouseN</I></A> x mNdate @ mNplace
  351.     |            (<A HREF="Family#I.html"> ¶ </A>) (<A href="Family#a.html"><B> ® </B></A>)
  352.     |_____ <A HREF="mNchild1.html"><I>mNchild1</I></A> * mNchild1birthdate + mNchild1birthdate
  353.     |_____ <A HREF="mNchildN.html"><I>mNchildN</I></A> * mNchildNbirthdate + mNchildNbirthdate
  354. <HR>
  355. Ancestors
  356.                   ,-<A HREF="GreatGrandFathersFathersFather.html"><B>GreatGrandFathersFathersFather</B></A> (FFFFF) * birthdate
  357.               ,-<A HREF="GreatGrandFathersFather.html"><B>GreatGrandFathersFather</B></A> (FFFF) * birthdate + deathdate
  358.              |    `-<A HREF="GreatGrandFathersFathersMother.html"><I>GreatGrandFathersFathersMother</I></A> (FFFFM) * birthdate
  359.           ,-<A HREF="GreatGrandFather.html"><B>GreatGrandFather</B></A> (FFF) * birthdate + deathdate
  360.          |   |    ,-<A HREF="GreatGrandFathersMothersFather.html"><B>GreatGrandFathersMothersFather</B></A> (FFFMF) * birthdate
  361.          |    `-<A HREF="GreatGrandFathersMother.html"><I>GreatGrandFathersMother</I></A> (FFFM) * birthdate + deathdate
  362.       ,-<A HREF="GrandFather.html"><B>GrandFather</B></A> (FF) * birthdate + deathdate
  363.      |    `-<A HREF="GreatGrandMother.html"><I>GreatGrandMother</I></A> (FFM) * birthdate + deathdate
  364.   ,-<A HREF="Father.html"><B>Father</B></A> (F) * birthdate + deathdate
  365.  |   |    ,-<A HREF="GreatGrandFather.html"><B>GreatGrandFather</B></A> (FMF) * birthdate + deathdate
  366.  |    `-<A HREF="GrandMother.html"><I>GrandMother</I></A> (FM) * birthdate + deathdate
  367.  |        `-<A HREF="GreatGrandMother.html"><I>GreatGrandMother</I></A> (FMM) * birthdate + deathdate
  368. Person * birthdate + deathdate
  369.  |        ,-<A HREF="GreatGrandFather.html"><B>GreatGrandFather</B></A> (MFF) * birthdate + deathdate
  370.  |    ,-<A HREF="GrandFather.html"><B>GrandFather</B></A> (MF) * birthdate + deathdate
  371.  |   |    `-<A HREF="GreatGrandMother.html"><I>GreatGrandMother</I></A> (MFM) * birthdate + deathdate
  372.   `-<A HREF="Mother.html"><I>Mother</I></A> (M) * birthdate + deathdate
  373.      |    ,-<A HREF="GreatGrandFather.html"><B>GreatGrandFather</B></A> (MMF) * birthdate + deathdate
  374.       `-<A HREF="GrandMother.html"><I>GrandMother</I></A> (MM) * birthdate + deathdate
  375.           `-<A HREF="GreatGrandMother.html"><I>GreatGrandMother</I></A> (MMM) * birthdate + deathdate
  376.               `-<A HREF="GreatGrandMothersMother.html"><I>GreatGrandMothersMother</I></A> (MMMM) * birthdate + deathdate
  377.                   `-<A HREF="GreatGrandMothersMothersMother.html"><I>GreatGrandMothersMothersMother</I></A> (MMMMM) * birthdate + deathdate
  378.                       `-<A HREF="GreatGrandMothersMothersMothersMother.html"><I>GreatGrandMothersMothersMothersMother</I></A> (MMMMMM) * birthdate + deathdate
  379.                           `-<A HREF="GreatGrandMothersMothersMothersMothersMother.html"><I>GreatGrandMothersMothersMothersMothersMother</I></A> (MMMMMMM) * birthdate + deathdate
  380. <HR>
  381. Descendants
  382.   <B>Person</B> * birthdate
  383.   &_<A HREF="Spouse1.html"><I>Spouse1</I></A> * birthdate
  384.   :|_<A HREF="m1child1.html"><I><B>m1child1</B></I></A> * m1child1birthdate
  385.   :|_<A HREF="m1child.html"><B><B>m1childN</B></B></A> * m1childNbirthdate
  386.   &_<A HREF="Spouse2.html"><I>Spouse2</I></A> * birthdate
  387.   :|_<A HREF="m2child1.html"><B>m2child1</B></A> * m2child1birthdate
  388.   :|_<A HREF="m2childN.html"><I>m2childN</I></A> * m2childNbirthdate
  389.   :  &_<A HREF="m2childNSpouse1.html"><I>m2childNSpouse1</I></A>
  390.   :   |_<A HREF="m2childNchild1.html"><B>m2childNchild1</B></A>
  391.   &_<A HREF="SpouseN.html"><I>SpouseN</I></A> * birthdate
  392.    |_<A HREF="mNchild1.html"><I>mNchild1</I></A> * mNchild1birthdate
  393.    |_<A HREF="mNchildN.html"><I>mNchildN</I></A> * mNchildNbirthdate
  394. <HR>
  395.      a template to represent Genealogy data in HTML hypertext.
  396.  * replace all ocurrences of each appropriate ITEM with ACTUAL DATA
  397.      e.g. search-replace-all Person with: My Name
  398.      e.g. query-search-replace Mother with: My Mother's Name
  399.  * judiciously edit .html file names in anchors
  400.  * add/remove lines for children, siblings, spouses as necessary
  401. </TT></PRE>
  402. </HTML>
  403. ############ genealogytemplate.html ################
  404.  
  405.  * In an HTML file (maybe HOME PAGE) have an anchor pointing to GenealogyFile:
  406.  
  407.  * ( see the hint at the end of a NORMAL run or specify ANCHOR )
  408. _____________________________________________________________________________
  409.  
  410.  * The PN{IRN}.DBNAME files are used to generate the " ¶ " files.
  411.  
  412.  * Whenever the PN{IRN}.DBNAME is changed or replaced, the corresponding
  413.  * " ¶ " file will be updated if 'rx Scion2html.rexx {IRN}' is re-run.
  414.  
  415.  * PP & FP Notes: (personal & family pictures; picture albums " ® ")
  416.  * ScionGenealogist names pictures as;
  417.  *      PP{IRN}.DBNAME (personal) and FP{mFGRN}.DBNAME (family)
  418.  * {P|F}P{IRN|mFGRN}.DBNAME now used as pictures & links.
  419.  *    GfxCon is used to copy/reduce jpegs from {P|F}P{IRN|mFGRN}.DBNAME
  420.  *    reductions are anchors pointing to HTML's for pictures albums
  421.  *    in pictures albums are anchors pointing to pictures
  422.  *  picture albums will not be overwritten; they may be updated with
  423.  *    additional pictures; links to other pictures, etc.
  424.  
  425.  * Whenever picture {P|F}P{IRN|mFGRN}.DBNAME is changed or replaced,
  426.  *  the corresponding images will be updated
  427.  
  428.  * {P|F}P{IRN|mFGRN}.DBNAME may be any legal GfxCon input picture FORMAT:
  429.  * (ILBM,RGB8,PCX,BMP,RLE8,TIFF,Targa,LBM,RGBN,IMG,RLE4,GIF,JPEG,RGB-Raw)
  430. */
  431.  
  432. stonegif = "47494638376140004000F70000F3F3F3
  433. EEEEEEE9E9E9E3E3E3DCEDEDDDDDDDDCCBCBD8D8D8D2D2D2CBDCDCCCCCCCCBBA
  434. BAC6C6C6C1C1C1BACBCBBBBBBBB6B6B6AABABA52525252525252525252525252
  435. 5252525252525252525252525252525252525252525252525252525252525252
  436. 5252525252525252525252525252525252525252525252525252525252525252
  437. 5252525252525252525252525252525252525252525252525252525252525252
  438. 5252525252525252525252525252525252525252525252525252525252525252
  439. 5252525252525252525252525252525252525252525252525252525252525252
  440. 5252525252525252525252525252525252525252525252525252525252525252
  441. 5252525252525252525252525252525252525252525252525252525252525252
  442. 5252525252525252525252525252525252525252525252525252525252525252
  443. 5252525252525252525252525252525252525252525252525252525252525252
  444. 5252525252525252525252525252525252525252525252525252525252525252
  445. 5252525252525252525252525252525252525252525252525252525252525252
  446. 5252525252525252525252525252525252525252525252525252525252525252
  447. 5252525252525252525252525252525252525252525252525252525252525252
  448. 5252525252525252525252525252525252525252525252525252525252525252
  449. 5252525252525252525252525252525252525252525252525252525252525252
  450. 5252525252525252525252525252525252525252525252525252525252525252
  451. 5252525252525252525252525252525252525252525252525252525252525252
  452. 5252525252525252525252525252525252525252525252525252525252525252
  453. 5252525252525252525252525252525252525252525252525252525252525252
  454. 5252525252525252525252525252525252525252525252525252525252525252
  455. 5252525252525252525252525252525252525252525252525252525252525252
  456. 52525252525252525252525252525252525252525252525252525252522C0000
  457. 0000400040000008FF00152860201041810308183478F0A00183870F050A6480
  458. 40C10383080E14CCC8E080C6040A1C1608595141C285140B1C2C90D0A4C70303
  459. 062800A9D1E548060E122268D04081030507180C78E9D1E04804081204553060
  460. A4C98A1E0B34553950A24189211F10B4EAD166839D070E9AECE85001CBB06111
  461. 0C2028D5694D841A150E7C88546981AD081CAC44DAB162D2033D332235AB31E9
  462. D90881752654C8B3A144C60C12AC35C97260CBA34D4B1254AB37E448AD7E9F22
  463. F5D8712953820306875D58152AD8A13A59AA64709760D096028F56A45DF96BC6
  464. B8BFC3DE44F8C025CEDF093ADEF5E830F941DB0829060D0BB42452B507042470
  465. 8870A743B59433CEFFBCEBA0FBE6AB668186347BD66CC98145254A3DA095BA46
  466. DF0252833799182EDD83090DE5164B3A691414450FDD755D027ED996D07306F5
  467. 2457427009C0526A3521A5125F027D85D050FFE5D65D4C1A1190125000228098
  468. 54B82D05DC4F2D5DF7D260BFAD651060DD79A45476452DA6505F83CD64517E10
  469. 2150DC8D26813491784CF2755086417DD55F61722508128273952495427E21D5
  470. 13505B7924C06E41E5A45A77049265526B0EF584104B5A1126104C4FD2E55F01
  471. 5F0195134C045194540204CA961554522520800004C4A41E80083D3556471656
  472. B55197B4AD7923546385F46594A73DD6D15C031178DB01C9B917DA427E91F693
  473. 824FC2D4957C7E5EFF57D046DD75289D4F8EA607D4504021F4954A2C81949972
  474. 1A6586D56914C1775F7561293967450E2C7060466735F5DD4EE5C9FA185C4511
  475. 58D0410C9A2AC0440D70FB5058326D85A274A9652953A98DF225175C0C3EC453
  476. 5911EDC49697E57A34808707961B9A4E437D57D940007764A7851CF956508F4B
  477. E628D00076C92B138DF6F917EF6E1CD9465153938DE614B5570A36E39AC33AF0
  478. 556A1D31D8148CBC0909D476EC498791475A95BA5969D7A995D4538561376B57
  479. F676E8927A6C65CA51C48309E527C248C215647BDA56745059CFAEB9E6C7ADA5
  480. 955E652DB7F99B5A266ABBE99C9F32D8284B7DBDD493821909ACF07A7BB2BDA1
  481. 421B86C650A5FCA1FF4D9D7B78B13D71AA16951859D7147DB955662B9146D0D9
  482. 6A4A86D450A432F6C0C60D50DCD0553E7B4BD8AF4526C98063579DA8E157DB1D
  483. 2440587D42405B46A9B517D4918D56D7216966252BDFE630797929554C617853
  484. 9FA335E8D2573F3D508085091EE4C0C7818D74974B15C16663710DEC69A472B9
  485. FF97394902957757036C1B3419AF85E1E9E67D176118179834256040D3756E6E
  486. D6BF2391FF407932355715888291114F6E84A78C008066C9329EB22C3393DD28
  487. 88620D10005DD674A0AFF1CA219BC1954DF8941404488B576AA9D77070341DD2
  488. 0CE027262C0E9AAA22957671292A493100698A472BD3D4AE3B180193510043A6
  489. 50350024BF21DF73FFE612279379473AF9A90B936A23A4C0AC4942D88990812E
  490. 8627C254667510C85C8C3664A64F69E84789BB4850002580F5050964FF8AD058
  491. 46F31649C58500E342914A9EA71E1CF66C2CB3E999DC0C43232305E937BD2A0E
  492. 447C539AE985072865DCCCC9CEB297B95451345F49495EC4139D18916F50634A
  493. 511F25752F89FC2432A5C19D607843A072B9C4010620DF6ED2C31C3C31285149
  494. 89930AA717A68EE88724505157AD32651615E64E23DE6210B5660281B12D8659
  495. 2D79C953C45220FD94267B3B7AE00FB5584781C9CA3F6E54CF2177F21EA9294B
  496. 2C1709607C48A63CE5192501F519C0E5A0A4B0B3F84A4358F1081D2D530038FE
  497. 884262C9D0D61CB2FF169938C54FFD7C0B284B93ACF59D2B23C9A14D7608D028
  498. 817DAB41AFEB16531066234532E52E29720995D83200D71DE02722011B4318F2
  499. 9DFBB50658A64CE3E856C3B9BCBCCF6345D90E100350388C2ECF5A035C934A84
  500. B324F554644CA3E34F1C3F331303FC2B5B15F9D2C8AAB3B24C6E653323438004
  501. 0D521C053168A755F91003C6F44783FCC88D47B14D7BD6344B060E2C5450F9E8
  502. 5328C6CD91C0A43CEB9108EBE27AABD8A488223BAA49B2A4C691E718C84F6101
  503. 4D4C02034516F58A5967C989464362A0AC3E559930440001DCF429E324F00010
  504. C851D07AD617A07DE96D84499C785878581DD1C660D4A3E4AE2C929CB8994A89
  505. A2528A6D783537B6FF6CA55CB1A28F6E1C25955CE15327D69C53BB1E34B1A361
  506. C44178292165AA239454AD6E37597CDA86E4A44CCA298C49CBB5AC4ABE949E61
  507. 52AA3C5D81094340DAA3A2C0552B3C41EE43CC94A579868A395CAA0C7A74C214
  508. 9894344F259128774473A30CC568276ACBC8B8D46A35B1E0C4908D5A1C14BF2A
  509. 12DAC23356F5ECD2755ED7960D31D33533A99D60962326D4E50F264C09007DB2
  510. F74CBF48C690C701904269251009F2507EFA0A527227F3CB980C607591D9E1D1
  511. 4AA5000824A929A61A1D46464B9F1999D2282A7C935A26B43F1FEF248B0CC98D
  512. D63CD6DFF77C8CA134AA8AEE72F33681DAC9475F1140001E50CCFBA5C9327C11
  513. 8CA55E5200F9FDC8B3C94AB49D92A813AEA529082101C05366A332BA9D298C36
  514. FA31CA6CC895C0A74897BB280ACDC80063972ABE6A80121451A22F65AF6471E9
  515. 62E279DE68165B176B522B2F06D032601AD2366A7545718F9B93D484832774F9
  516. 4635E80193CDAA223F076451421E0E96BD30181CEA1C04D335C3D170D6659952
  517. 13065DBDBB9F8586D214BDBA298FF1D1F44F6655009581053018140D55144325
  518. 504147C92A890912575257D5AC855B01D8999E7AFD90521984260101003B"X
  519.  
  520. /* Hex file above was generated as follows:
  521.    (1) From CLI, typed "type > RAM:temp Stone.gif opt h"
  522.    (2) From a text editor (preferably one with "vertical" block marking),
  523.        removed all the extraneous stuff from resulting "RAM:temp"
  524.    (3) Using text editor, imported the resulting hex file as follows (note
  525.        enclosing quotes and extra "X" at the end).    */
  526.  
  527. /* add libraries */
  528. libs = 'rexxsupport.library rexxarplib.library'
  529. DO i = 1 TO Words(libs)
  530.  lib = Word(libs,i)
  531.  if ~Show('Lib',lib) then do
  532.   if EXISTS('LIBS:'lib) then call addlib lib, 0, -30
  533.   else do
  534.    say ' '
  535.    say 'ERROR: cannot find' lib 'in LIBS:'
  536.    say ' '
  537.    if lib = 'rexxsupport.library' then do
  538.     say ' please copy rexxsupport.library from WorkBench disk:libs'
  539.     end
  540.    else do
  541.     say ' please get rexxarplib.library from aminet:util/rexx'
  542.     end
  543.    say ' '
  544.    AskExit()
  545.    end
  546.   end
  547.  end i
  548.  
  549.             /*   some Intitializations = default        */
  550. flags.Thumbnail = 350    /* Thumbnail maximum dimensions            */
  551. flags.Thmbfmt = "JPEG"    /* Thumbnail format { GIF | JPEG }        */
  552. flags.MakeHTML = 0    /* 0 to make HTML                */
  553. flags.MakeText = 0    /* 1 to make printable ASCII text file        */
  554. flags.MakeGuide = 0    /* 1 to make ".guide" hypertext files        */
  555.  flags.verbose = 0    /* 1 for verbose progress reports        */
  556. flags.bold = 0        /* 0 male «boldface» & female «italic»        */
  557. flags.living = 0        /* > 0 show: Living...                */
  558. flags.GenPrefix = ""    /* needs only be set for specific circumstances 
  559.              ( if this makes no sense, you don't need it :) */
  560.  
  561. sayASCII = ' plain ASCII printable files'
  562. sayguide = ' ".guide" hypertext files'
  563. sayHTML = ' ".htm" hypertext files for WWW Net surfers'
  564. bolditalic = ' using boldface » men and italic » women'
  565. progress = ' progress reports'
  566.  
  567. if EXISTS('rexx:Scion2html.rexx') then rexxdir = "rexx:"
  568. else rexxdir = ""
  569.  
  570. OldScion2html = Open('Scion2html','S:Scion2html.Config','r')
  571.  
  572. if OldScion2html then do
  573.  Close('Scion2html')
  574.  say '... moving S:Scion2html.Config ---> ENVARC:Scion/Scion2html.Config'
  575.  address command 'C:copy S:Scion2html.Config ENVARC:Scion/Scion2html.Config'
  576.  address command 'C:delete S:Scion2html.Config'
  577.  say ' '
  578.  end
  579.  
  580. GoodScion2html = Open('Scion2html','ENVARC:Scion/Scion2html.Config','r')
  581.  
  582. ChangedScion2html = ~GoodScion2html
  583.  
  584. if GoodScion2html then do
  585.  Mdir = readln('Scion2html')
  586.  flags.Thumbnail = readln('Scion2html')
  587.  flags.Thmbfmt = readln('Scion2html')
  588.  coumpound = readln('Scion2html')
  589. /*
  590. say 'coumpound = 'coumpound
  591. do bitnum = 0 to 7 by 1
  592.  say 'bit 'bitnum' = 'bittst(coumpound,bitnum)
  593.  end
  594.           tstbittest = 0
  595. say 'tstbittest = 'tstbittest
  596. do bitnum = 0 to 7 by 1
  597.  say 'bit 'bitnum' = 'bittst(tstbittest,bitnum)
  598.  end
  599.           tstbittest = 7
  600. say 'tstbittest = 'tstbittest
  601. do bitnum = 0 to 7 by 1
  602.  say 'bit 'bitnum' = 'bittst(tstbittest,bitnum)
  603.  end
  604. */
  605.  
  606.  flags.MakeHTML = bittst(coumpound,3)
  607.  flags.MakeGuide = bittst(coumpound,2)
  608. /* flags.verbose */
  609.  flags.bold = bittst(coumpound,1)
  610.  flags.MakeText = bittst(coumpound,0)
  611.  flags.GenPrefix = readln('Scion2html')
  612.  Close('Scion2html')
  613.  
  614.  say '                     '
  615.  say '   Scion2html.Config  settings:'
  616.  say '  output destination: 'Mdir
  617.  end
  618.  
  619. else do
  620.  say '           '
  621.  say '   default  settings:'
  622.  say '  output destination: (will be set later)'
  623.  end
  624.  
  625. say '  Thumbnail: 'flags.Thmbfmt' max 'flags.Thumbnail'x'flags.Thumbnail
  626. if flags.GenPrefix ~= '' then say '  GeneralPrefix = 'flags.GenPrefix
  627.  else say '  GeneralPrefix = {default} [special circumstance only]'
  628. /* in work
  629. if ~flags.MakeHTML then say '  make'sayHTML
  630.  else say ' NOT making'sayHTML
  631. */
  632. if flags.MakeGuide then say '  make'sayguide
  633.  else say ' NOT making'sayguide
  634. if flags.MakeText then say '  make'sayASCII
  635.  else say ' NOT making'sayASCII
  636. if ~flags.bold then say ' 'bolditalic
  637.  else say ' NOT'bolditalic
  638. if flags.verbose then say ' verbose'progress
  639.  else say '  minimal'progress' (during "normal" runs)'
  640. say ' '
  641.  
  642. if flags.GenPrefix = "" then flags.GenPrefix = "GENEAFI"
  643.  
  644. say '                                                               '
  645. say ' Note: Scion2html.rexx cannot run while Scion is in HELP mode. '
  646. SAY ' '
  647.  
  648. Address "SCIONGEN"    /* Point at Scion Genealogist port */
  649. options RESULTS
  650.  
  651. if Show(p,'SCIONGEN') then do
  652.  'GETDBNAME'     /* Issue GET DB NAME command to Scion Genealogist */
  653.  DBNAME = RESULT
  654.  'GETTOTALIRN'
  655.  TOTALIRN = RESULT
  656.  if TOTALIRN = 0 then do
  657.  SAY '                                                                  '
  658.  SAY '   Scion Genealogist is currently displaying an EMPTY data base!  '
  659.  SAY '                                                                  '
  660.  SAY ' '
  661.  AskExit()
  662.   end
  663.  end
  664.  
  665. else do
  666.  SAY '                                                               '
  667.  SAY '   Scion Genealogist is NOT currently displaying a data base:  '
  668.  SAY '                                                               '
  669.  SAY ' Please start Scion; load desired data base; then try again... '
  670.  SAY '                                                               '
  671.  SAY ' '
  672.  AskExit()
  673.  end
  674.  
  675. PARSE ARG flags.target
  676. flags.target = Upper(strip(flags.target,,'"')) /* just in case, remove errant quotes */
  677.  
  678. origThumbnail = flags.Thumbnail
  679. origThumbformat = flags.Thmbfmt
  680.  
  681. blanks = '                                                        '
  682.  
  683. flags.DoPictures = CheckGfxCon()
  684.  
  685. DO WHILE flags.target = '' | flags.target = '?' | flags.target = '/' | flags.target = 'H'
  686.  SAY ' '
  687.  if flags.target = '?' | flags.target = '/' | flags.target = 'H' then do
  688.   SAY ' please send comments, questions to: ipolyi@pat.mdc.com'
  689.   SAY '                                    or:'
  690.   SAY '             Scion2html.rexx  ©  Harold H. Ipolyi '
  691.   SAY '                                  P.O.Box 891206 '
  692.   SAY '                                  Houston, Tx 77289-1206'
  693.   SAY '   ____________________________________________________________'
  694.   SAY '  /                                                            \'
  695.   SAY ' / to [re]create HTML hypertext from ScionGenealogist data base \'
  696.   SAY ' \ also, optionally, AmigaGuide style hypertexts or plain ASCII /'
  697.   SAY '  \____________________________________________________________/'
  698.   SAY ' '
  699.  
  700.  
  701.   SAY '                                 '
  702.   SAY ' sub-menu:    »»» pressing RETURN accepts [value]'
  703.   SAY '         '
  704.   SAY ' defaults  change settings of default parameters'
  705.  
  706.   SAY '        '
  707.   SAY '  readme   view Scion2html.rexx readme information'
  708.   SAY '         '
  709.   SAY '  history  review the Release History of Scion2html.rexx'
  710.   if GoodScion2html then do
  711.    SAY '         '
  712.    SAY ' template  Create a Genealogy template 'Mdir'genealogytemplate.html'
  713.    end
  714.   SAY '        '
  715.   SAY '  cancel  '
  716.   SAY ' '
  717.  
  718.   call writech(stdout,' [cancel] ')
  719.   PULL answer
  720.  
  721.   if answer = 'DEFAULTS' | answer = 'D' then do
  722.  
  723.    SAY '                                 '
  724.    SAY ' defaults: may be changed; RETURN accepts [value]'
  725.    svMdir = Mdir
  726.    SAY '                    'substr(blanks,1,length(DBNAME)+3)''
  727.    call writech(stdout,' HTMLs in directory  'DBNAME'G  within ['Mdir'] ')
  728.    PULL Mdir
  729.    if Mdir = '' then Mdir = svMdir
  730.    ChangedScion2html = ChangedScion2html | ( Mdir ~= svMdir )
  731.    SAY ' '
  732.    svGeneralPrefix = flags.GenPrefix
  733.    call writech(stdout,' General Prefix ')
  734.    if flags.GenPrefix ~= 'GENEAFI' then call writech(stdout,'(. to reset) ')
  735.    call writech(stdout,' = [')
  736.    if flags.GenPrefix ~= 'GENEAFI' then call writech(stdout,flags.GenPrefix)
  737.    call writech(stdout,'] ')
  738.    PARSE PULL flags.GenPrefix
  739.    if flags.GenPrefix = '' then flags.GenPrefix = svGeneralPrefix
  740.    else if flags.GenPrefix = '.' then flags.GenPrefix = 'GENEAFI'
  741.    ChangedScion2html = ChangedScion2html | ( flags.GenPrefix ~= svGeneralPrefix )
  742.    SAY ' '
  743. /* in work
  744.    if flags.MakeHTML then writech(stdout,' NOT m')
  745.    else writech(stdout,' M')
  746.    writech(stdout,'aking'sayHTML'; ')
  747.    call writech(stdout,' acceptable? [yes] ')
  748.    PULL answer
  749.    if answer ~= '' then do
  750.     if substr(answer,1,1) = 'N' then do
  751.      flags.MakeHTML = ~flags.MakeHTML
  752.      ChangedScion2html = 1
  753.      end
  754.     end
  755.    SAY ' '
  756. */
  757.    if ~flags.MakeGuide then writech(stdout,' NOT m')
  758.    else writech(stdout,' M')
  759.    writech(stdout,'aking'sayguide'; ')
  760.    call writech(stdout,' acceptable? [yes] ')
  761.    PULL answer
  762.    if answer ~= '' then do
  763.     if substr(answer,1,1) = 'N' then do
  764.      flags.MakeGuide = ~flags.MakeGuide
  765.      ChangedScion2html = 1
  766.      end
  767.     end
  768.    SAY ' '
  769.    if ~flags.MakeText then writech(stdout,' NOT m')
  770.    else writech(stdout,' M')
  771.    writech(stdout,'aking'sayASCII'; ')
  772.    call writech(stdout,' acceptable? [yes] ')
  773.    PULL answer
  774.    if answer ~= '' then do
  775.     if substr(answer,1,1) = 'N' then do
  776.      flags.MakeText = ~flags.MakeText
  777.      ChangedScion2html = 1
  778.      end
  779.     end
  780.    SAY ' '
  781.    if flags.bold then writech(stdout,' NOT')
  782.    writech(stdout,bolditalic'; ')
  783.    call writech(stdout,' acceptable? [yes] ')
  784.    PULL answer
  785.    if answer ~= '' then do
  786.     if substr(answer,1,1) = 'N' then do
  787.      flags.bold = ~flags.bold
  788.      ChangedScion2html = 1
  789.      end
  790.     end
  791.    SAY ' '
  792.    if ~flags.verbose then writech(stdout,' minimal')
  793.    else writech(stdout,' verbose')
  794.    writech(stdout,progress'; ')
  795.    call writech(stdout,' acceptable? [yes] ')
  796.    PULL answer
  797.    if answer ~= '' then do
  798.     if substr(answer,1,1) = 'N' then flags.verbose = ~flags.verbose
  799.     end
  800.    if flags.DoPictures then do
  801.     SAY ' '
  802.     SAY '+-----------------------------------------------------------------+'
  803.     SAY '| NOTE: changing Thumbnail max dim or Thumbnail format will force |'
  804.     SAY '|       regeneration of all Thumbnail pictures. Just so you know! |'
  805.     SAY '+-----------------------------------------------------------------+'
  806.     SAY '|       If Thumbnail format is changed, Picture Albums must then  |'
  807.     SAY '|       be manually edited to reflect the new Thumbnail suffixes. |'
  808.     SAY '+-----------------------------------------------------------------+'
  809.     SAY ' '
  810.     svThumbnail = flags.Thumbnail
  811.     call writech(stdout,' Thumbnail max dim = ['flags.Thumbnail'] ')
  812.     PULL flags.Thumbnail
  813.     if ~IsNumeric(flags.Thumbnail) then flags.Thumbnail = svThumbnail
  814.     ChangedScion2html = ChangedScion2html | ( flags.Thumbnail ~= svThumbnail )
  815.     if flags.Thumbnail < 100 then flags.Thumbnail = 100
  816.     SAY ' '
  817.     svThumbformat = flags.Thmbfmt
  818.     call writech(stdout,' Thumbnail format = ['flags.Thmbfmt'] ')
  819.     PULL flags.Thmbfmt
  820.     if flags.Thmbfmt ~= 'GIF' & flags.Thmbfmt ~= 'JPEG' then flags.Thmbfmt = ''
  821.     if flags.Thmbfmt = '' then flags.Thmbfmt = svThumbformat
  822.     ChangedScion2html = ChangedScion2html | ( flags.Thmbfmt ~= svThumbformat )
  823.     end
  824.    SAY ' '
  825.    end
  826.  
  827.   else if answer = 'TEMPLATE' | answer = 'T' then do
  828.    if Open('genealogytemplate',Mdir'genealogytemplate.html','w') then do
  829. /*
  830.     if ~exists(Mdir'st0ne.gif') then do
  831.      OPEN('giffile',Mdir'st0ne.gif','W')
  832.      WRITECH('giffile', stonegif)
  833.      CLOSE('giffile')
  834.      end
  835. */
  836.     Open('Scion',rexxdir'Scion2html.rexx','r')
  837.     readme = 0
  838.     notbreak = 1
  839.     readmestring = '############ genealogytemplate.html ################'
  840.     DO While ~EOF('Scion') & notbreak
  841.      line = ReadLn('Scion')
  842.      if readme then do
  843.       if line = readmestring then do
  844.        close('genealogytemplate')
  845.        say ' '
  846.        say '                    created: 'Mdir'genealogytemplate.html'
  847.        say ' '
  848.        say ' <a href="/'Mdir'genealogytemplate.html">Genealogy template</a>'
  849.        notbreak = 0
  850.        end
  851.       if notbreak then WriteLn('genealogytemplate',line)
  852.       end
  853.      if line = readmestring then readme = ~readme
  854.      end
  855.      close('Scion')
  856.     end
  857.    end
  858.  
  859.   else if answer = 'HISTORY' | answer = 'H' then do
  860.    if Open('Scion',rexxdir'Scion2html.rexx','r') then do
  861.     readme = 0
  862.     notbreak = 1
  863.     readmestring = '=====History====='
  864.     DO While ~EOF('Scion') & notbreak
  865.      line = ReadLn('Scion')
  866.      if readme then do
  867.       if line = readmestring then notbreak = 0
  868.       if notbreak then say line
  869.       end
  870.      if line = readmestring then readme = ~readme
  871.      end
  872.      close('Scion')
  873.     end
  874.    end
  875.  
  876.   else if answer = 'README' | answer = 'R' then do
  877.    if Open('Scion',rexxdir'Scion2html.rexx','r') then do
  878.     if Open('Scionreadme','RAM:Scion2html.readme','w') then do
  879.      readme = 0
  880.      notbreak = 1
  881.      readmestring = '=====README====='
  882.      DO While ~EOF('Scion') & notbreak
  883.       line = ReadLn('Scion')
  884.       if readme then do
  885.        if line = readmestring then do
  886.         close('Scionreadme')
  887.         say '                      created: RAM:Scion2html.readme'
  888.         notbreak = 0
  889.         end
  890.        if notbreak then do
  891.         WriteLn('Scionreadme',line)
  892.         say line
  893.         end
  894.        end
  895.       if line = readmestring then readme = ~readme
  896.       end
  897.      end
  898.      close('Scion')
  899.     end
  900.    end
  901.  
  902.   end
  903.  
  904.  SAY '                               '
  905.  SAY '   menu:    »»» pressing RETURN accepts [value]'
  906.  SAY '        '
  907.  SAY '   Quit   '
  908.  SAY '       '
  909.  SAY '     ?      about Scion2html.rexx; also can change the settings shown above.'
  910.  SAY '                                              'substr(blanks,1,length(DBNAME)+2)''
  911.  SAY '  Normal    [re]make HTMLs for all persons in  'DBNAME'  data base {'TOTALIRN'}'
  912.  SAY '       '
  913.  SAY '     #      [re]make HTMLs for a specific person: { 1 .. 'TOTALIRN' }'
  914.  SAY '          '
  915.  SAY '  Anchors   hints for: <A href="?">'DBNAME' Genealogy</A>'
  916.  SAY ' '
  917.  
  918.  SAY ' '
  919.  flags.target = 'Normal'
  920.  call writech(stdout,' ['flags.target'] ')
  921.  
  922.  PULL flags.target
  923.  
  924.  if length(flags.target) > 1 & substr(flags.target,1,1) = ' ' then flags.target = substr(flags.target,2,length(flags.target))
  925.  if length(flags.target) > 7 then flags.target = substr(flags.target,1,7)
  926.  if flags.target = '' then flags.target = 'Normal'
  927.  if substr(flags.target,1,1) = '#' then do
  928.   flags.target = ''
  929.   SAY ' '                                    /* :) :) :) :) :) */
  930.   SAY '     NOT #! An actual number, like, you know :), from the set { 1 .. 'TOTALIRN' }'
  931.   end
  932.  if flags.target = 'INFO' | flags.target = 'ABOUT' | flags.target = 'HELP' then flags.target = '?'
  933.  if IsNumeric(flags.target) then do
  934.   if flags.target > TOTALIRN | flags.target < 1 then do
  935.     SAY ' '
  936.     SAY '     Lousy shooting:'
  937.     SAY ' 'flags.target' is outside range of { 1 .. 'TOTALIRN' } of persons in data base  'DBNAME' '
  938.     SAY '     Clean your display, rinse your lenses, and try again!'
  939.     flags.target = ''
  940.    end
  941.   end
  942.  flags.target = Upper(strip(flags.target,,'"'))    /* just in case, remove errant quotes */
  943.  end
  944.  
  945. if ~Validtarget(flags.target) then PauseExit()
  946.  
  947. if substr(flags.target,1,1) = 'A' then flags.target = 'ANCHORS'
  948. if substr(flags.target,1,1) = 'N' then flags.target = 'NORMAL'
  949. if substr(flags.target,1,1) = 'Q' then flags.target = 'QUIT'
  950.  
  951. /* SAY flags.target */
  952.  
  953. 'GETPROGVERSION'
  954. VERSION = RESULT
  955.  
  956. if VERSION < 4.07 then do
  957.  SAY ' '
  958.  say 'ERROR: Requires Scion VERSION = 4.07 (or greater)'
  959.  AskExit()
  960.  end
  961. else do
  962.  if exists("sys:utilities/multiview") then
  963.   flags.VIEWER = "sys:utilities/multiview"    /* Guide picture viewer    */
  964.  else do
  965.   if VERSION < 4.09 then flags.VIEWER = "display"
  966.   else do
  967.    'GETVIEWER'
  968.    flags.VIEWER = RESULT
  969.    end
  970.   end
  971. /* say 'Guide picture viewer = 'flags.VIEWER */
  972.  end
  973.  
  974. /* Get path to database so can locate any note files in same location */
  975. 'GETDBPATH'        /* new in Scion V 4.07 */
  976. DBPATH = RESULT
  977. DBPATH = CheckPathName(DBPATH)
  978.  
  979. /*
  980. SAY ' '
  981. Say ' Testing: is data base assignment of 'DBPATH||DBNAME' visible?'
  982. SAY ' '
  983. */
  984.  
  985. PRAGMA('w','n')
  986. if ~Exists(DBPATH||DBNAME) then do
  987.  SAY 'ERROR: Scion data base 'DBNAME' not found in: 'DBPATH
  988.  AskExit()
  989.  end
  990.  
  991. if ~GoodScion2html then do
  992.  Mdir = ''            /* where to put the directories? */
  993.  if Exists(DBNAME'G') then do    /* check current path */
  994.   Mdir = PRAGMA('d')        /* we're already there */
  995.   end
  996.  else do
  997.   TXTdir = "RAM:"                    /* RAM: if nothing else */
  998.   if Exists('Work:') then TXTdir = "Work:"    /* assume Work: */
  999.   SAY ' '                /* ask, with default prompted */
  1000.   if flags.target ~= 'ANCHORS' then call writech(stdout,'Generate ')
  1001.   call writech(stdout,'Directory 'DBNAME'G for HTML pages ')
  1002.   if flags.target = 'ANCHORS' then call writech(stdout,'is ')
  1003.   call writech(stdout,'in: ['TXTdir'] ')
  1004.   PULL Mdir
  1005.   if Mdir = '' then Mdir = TXTdir        /* default was accepted */
  1006.   end
  1007.  end
  1008.  
  1009. Mdir = CheckPathName(Mdir)
  1010.  
  1011. PRAGMA('w','w')
  1012.  
  1013. if ~flags.MakeHTML then HTMLdir = Mdir||DBNAME'G'
  1014. TXTdir = ''
  1015. if flags.MakeText then TXTdir = Mdir||DBNAME'T'
  1016. if flags.MakeGuide then AGdir = Mdir||DBNAME'AG'
  1017.  
  1018. flags.RemakeThumb = ( origThumbnail ~= flags.Thumbnail ) | ( origThumbformat ~= flags.Thmbfmt )
  1019.  
  1020. if ChangedScion2html then do
  1021.  Open('Scion2html','ENVARC:Scion/Scion2html.Config','w')
  1022.  call writeln('Scion2html',Mdir)
  1023.  call writeln('Scion2html',flags.Thumbnail)
  1024.  call writeln('Scion2html',flags.Thmbfmt)
  1025.  coumpound = 0
  1026.  if flags.MakeText then coumpound = bitset(coumpound,0)
  1027.  if flags.bold then coumpound = bitset(coumpound,1)
  1028.  if flags.MakeGuide then coumpound = bitset(coumpound,2)
  1029.  if flags.MakeHTML then coumpound = bitset(coumpound,3)
  1030. /*
  1031. say 'coumpound as written = 'coumpound
  1032. */
  1033.  call writeln('Scion2html',coumpound)
  1034. /*
  1035.  call writeln('Scion2html',flags.MakeText + ( 2 * flags.bold ) + 
  1036. ( 4 * flags.MakeGuide ) + ( 8 * flags.MakeHTML ) )
  1037. */
  1038.  if flags.GenPrefix ~= 'GENEAFI' then call writeln('Scion2html',flags.GenPrefix)
  1039.  Close('Scion2html')
  1040.  end
  1041.  
  1042. if flags.target = 'QUIT' then PauseExit()
  1043.  
  1044. if ~flags.bold then do
  1045.  flags.htmlb = '<B>'
  1046.  flags.htmlub = '</B>'
  1047.  flags.htmli = '<I>'
  1048.  flags.htmlui = '</I>'
  1049.  end
  1050. else do
  1051.  flags.htmlb = ''
  1052.  flags.htmlub = ''
  1053.  flags.htmli = ''
  1054.  flags.htmlui = ''
  1055.  end
  1056.  
  1057. if flags.target ~= "ANCHORS" then do
  1058.  if ~flags.MakeHTML then do
  1059.   if ~Makedir(HTMLdir) then do
  1060.    SAY ' '
  1061.    SAY 'ERROR: unable to create directory: 'HTMLdir
  1062.    AskExit()
  1063.    end
  1064.   if ~exists(HTMLdir'/st0ne.gif') then do
  1065.    OPEN('giffile',HTMLdir'/st0ne.gif','W')
  1066.    WRITECH('giffile', stonegif)
  1067.    CLOSE('giffile')
  1068.    end
  1069.   end
  1070.  
  1071.  if TXTdir ~= '' then do
  1072.   if ~Makedir(TXTdir) then do
  1073.    SAY ' '
  1074.    SAY 'ERROR: unable to create directory: 'TXTdir
  1075.    AskExit()
  1076.    end
  1077.   end
  1078.  
  1079.  if flags.MakeGuide then do
  1080.   if ~Makedir(AGdir) then do
  1081.    SAY ' '
  1082.    SAY 'ERROR: unable to create directory: 'AGdir
  1083.    AskExit()
  1084.    end
  1085.   end
  1086. /*
  1087.  Say "Number of people in database " DBNAME " = " TOTALIRN
  1088.  SAY ' '
  1089. */
  1090.  end
  1091.  
  1092. starttime = Time('e')
  1093.  
  1094. do i = 1 to TOTALIRN
  1095.  person.gotten.i = 0    /* no persons have yet been gotten from "DBNAME" */
  1096.  end
  1097.  
  1098. /* S:Scion2html.Config was here */
  1099.  
  1100. if IsNumeric(flags.target) then do
  1101.  
  1102.  GetPerComp(flags.target) /* GetPerComp gets basic info into person. array */
  1103.  
  1104.  pnumb = flags.target
  1105.  
  1106. /*
  1107.  call writech(stdout,'HTMLs for: 'person.GETFULLNAME.pnumb'? ['yes'] ')
  1108.  PULL answer
  1109.  if answer = '' then answer = 'YES'
  1110.  if substr(answer,1,1) ~= 'Y' then AskExit()
  1111. */
  1112.  call writech(stdout,'         HTMLs')
  1113.  if flags.MakeGuide then
  1114.   call writech(stdout,' & guides')
  1115.  if flags.MakeText then
  1116.   call writech(stdout,' & ASCIItextfile')
  1117.  call writeln(stdout,' for: 'person.GETFULLNAME.pnumb' {'pnumb'}')
  1118.  
  1119.  starttime = Time('e')
  1120.  
  1121.  if flags.target <= TOTALIRN then do
  1122. /*
  1123.   Say 'Processing person ' flags.target ' of ' TOTALIRN ' in database ' DBNAME
  1124. */
  1125.   if TXTdir ~= '' then Open('GenealogyText',TXTdir'/G'flags.target,'w')
  1126.   flags.living = askliving()
  1127.   flags.verbose = 1
  1128.   'EXISTPERSON' flags.target
  1129.   if RESULT = 'YES' then CALL MakeOne(flags.target)
  1130.   else say 'flags.target is a null IRN'
  1131.   if TXTdir ~= '' then Close('GenealogyText')
  1132.   end
  1133.  end
  1134.  
  1135. else do
  1136.  
  1137.  flags.target = Upper(flags.target)
  1138.  
  1139.  if flags.target ~= "ANCHORS" then do
  1140.  
  1141.   flags.target = 'NORMAL'
  1142.   flags.living = askliving()
  1143.   Say ' '
  1144.   call writech(stdout,' HTMLs')
  1145.   if flags.MakeGuide then
  1146.    call writech(stdout,' & guides')
  1147.   if flags.MakeText then
  1148.    call writech(stdout,' & ASCIItextfile')
  1149.   call writeln(stdout,' for all ' TOTALIRN ' persons in database ' DBNAME)
  1150.  
  1151. /* GENEAFIL.htm is a Scion data base IRN order list of all persons in 
  1152.    HTML format: person * birthdate + deathdate (()) father & mother */
  1153.  
  1154.   Say ' '
  1155.   Say 'file name: 'HTMLdir'/'flags.GenPrefix'L.htm for: Personae'
  1156.  
  1157.   Open('GenealogyFile',HTMLdir'/'flags.GenPrefix'N.htm','w')
  1158.   Open('GenealogyFite',HTMLdir'/'flags.GenPrefix'L.htm','w')
  1159.   WriteLn('GenealogyFile','<HTML>')
  1160.   WriteLn('GenealogyFite','<HTML>')
  1161.   WriteLn('GenealogyFile','<TITLE>Personae</TITLE>')
  1162.   WriteLn('GenealogyFite','<TITLE>Personae</TITLE>')
  1163.   WriteLn('GenealogyFile','<BODY BACKGROUND="st0ne.gif">')
  1164.   WriteLn('GenealogyFite','<BODY BACKGROUND="st0ne.gif">')
  1165.   WriteLn('GenealogyFite','<H4><a href="/'HTMLdir'/'flags.GenPrefix'N.htm"')
  1166.   WriteCh('GenealogyFite','>Personae sans tables</A>')
  1167.   WriteLn('GenealogyFile','<H3>Personae in data base "'DBNAME'". 'flags.htmlb''Time()' - 'Date()''flags.htmlub'</H2>')
  1168.   WriteLn('GenealogyFite','<H3>Personae in data base "'DBNAME'". 'flags.htmlb''Time()' - 'Date()''flags.htmlub'</H2>')
  1169.   WriteLn('GenealogyFile','<H4>')
  1170.   WriteLn('GenealogyFite','<H4>')
  1171.  
  1172.   WriteLn('GenealogyFite','<p><table border cellpadding=3><tr>')
  1173.   WriteLn('GenealogyFite','<th></th>')
  1174.   WriteLn('GenealogyFite','<th>*</th>')
  1175.   WriteLn('GenealogyFite','<th>+</th>')
  1176.   WriteLn('GenealogyFite','<th> [~_~] </th>')
  1177.   WriteLn('GenealogyFite','<th> {^.^} </th>')
  1178.   WriteLn('GenealogyFite','</tr>')
  1179.  
  1180.   if flags.MakeGuide then do
  1181.    Say ' '
  1182.    Say 'file name: 'AGdir'/'flags.GenPrefix'L.guide for: Personae'
  1183.    Open('GenealogyGuide',AGdir'/'flags.GenPrefix'L.guide','w')
  1184.    WriteLn('GenealogyGuide','@database "'flags.GenPrefix'L.guide"')
  1185.    WriteLn('GenealogyGuide','@NODE Main "'DBNAME' Genealogy"')
  1186.    WriteLn('GenealogyGuide',' ')
  1187.    WriteLn('GenealogyGuide','Personae in data base "'DBNAME'". @{b}'Time()' - 'Date()'@{ub}')
  1188.    WriteLn('GenealogyGuide',' ')
  1189.    end
  1190.  
  1191.   if flags.MakeText then do
  1192.    Open('GenealogyText',TXTdir'/GenealogyOf'DBNAME,'w')
  1193.    WriteLn('GenealogyText','Genealogy Data Base "'GetLastName(DBNAME)'"')
  1194.    end
  1195.  
  1196.   DO i = 1 TO TOTALIRN
  1197.    'EXISTPERSON' i
  1198.    if RESULT = 'YES' then CALL MakeOne(i)
  1199.    else say 'i is a null IRN'
  1200.    end
  1201.  
  1202.   if flags.MakeGuide then do
  1203.    WriteLn('GenealogyGuide','_______________________________________________')
  1204.    WriteLn('GenealogyGuide','')
  1205.    WriteCh('GenealogyGuide','Definitions: ')
  1206.    if ~flags.bold then
  1207.     WriteCh('GenealogyGuide','@{b}bold=male@{ub}, @{i}italic=fem@{ui},')
  1208.    WriteLn('GenealogyGuide',' * birth, + death, ¶ more info')
  1209.    WriteLn('GenealogyGuide','_______________________________________________')
  1210.    WriteLn('GenealogyGuide','')
  1211.    WriteCh('GenealogyGuide','Credits: ')
  1212.    WriteCh('GenealogyGuide','(@{i}AMIGA@{ui}) · ')
  1213.    WriteCh('GenealogyGuide','(Scion © @{b}Robbie J Akins@{ub}) · ')
  1214.    WriteLn('GenealogyGuide','(Scion2html.rexx © @{b}Harold Ipolyi@{ub})')
  1215.    WriteLn('GenealogyGuide','@ENDNODE')
  1216.    Close('GenealogyGuide')
  1217.    end
  1218.  
  1219.   WriteCh('GenealogyFile','</H4>')
  1220.   WriteCh('GenealogyFite','</table></H4>')
  1221.   WriteCh('GenealogyFile','<HR>')
  1222.   WriteCh('GenealogyFite','<HR>')
  1223.   WriteLn('GenealogyFile','<Address>')
  1224.   WriteLn('GenealogyFite','<Address>')
  1225.   WriteCh('GenealogyFile','Definitions: ')
  1226.   WriteCh('GenealogyFite','Definitions: ')
  1227.   if ~flags.bold then do
  1228.    WriteCh('GenealogyFile',flags.htmlb'bold=male'flags.htmlub', 'flags.htmli'italic=fem'flags.htmlui',')
  1229.    WriteCh('GenealogyFite',flags.htmlb'bold=male'flags.htmlub', 'flags.htmli'italic=fem'flags.htmlui',')
  1230.    end
  1231.   WriteLn('GenealogyFile',' * birth, + death, ¶ more info, ® picture album')
  1232.   WriteLn('GenealogyFite',' * birth, + death, ¶ more info, ® picture album')
  1233.   WriteCh('GenealogyFile','<HR>Credits: ')
  1234.   WriteCh('GenealogyFite','<HR>Credits: ')
  1235.   WriteCh('GenealogyFile','('flags.htmli'<A href="http://www.omnipresence.com/')
  1236.   WriteCh('GenealogyFite','('flags.htmli'<A href="http://www.omnipresence.com/')
  1237.   WriteLn('GenealogyFile','amiga/">AMIGA</A>'flags.htmlui'®')
  1238.   WriteLn('GenealogyFite','amiga/">AMIGA</A>'flags.htmlui'®')
  1239. /*
  1240.   WriteLn('GenealogyFile',' 'flags.htmlb<A href="http://www.amiga.de/">')
  1241.   WriteLn('GenealogyFite',' 'flags.htmlb<A href="http://www.amiga.de/">')
  1242.   WriteLn('GenealogyFile','Tech GmbH</A>'flags.htmlub)
  1243.   WriteLn('GenealogyFite','Tech GmbH</A>'flags.htmlub)
  1244. */
  1245.   WriteLn('GenealogyFile',') · ')
  1246.   WriteLn('GenealogyFite',') · ')
  1247.   'GETPROGVERSION'
  1248.   VERSION = RESULT
  1249.   WriteCh('GenealogyFile','(<A href="http://wuarchive.wustl.edu/pub/aminet/')
  1250.   WriteCh('GenealogyFite','(<A href="http://wuarchive.wustl.edu/pub/aminet/')
  1251.   WriteCh('GenealogyFile','info/www/dirs/')
  1252.   WriteCh('GenealogyFite','info/www/dirs/')
  1253.   WriteCh('GenealogyFile','biz_dbase.html">'flags.htmlb'Scion')
  1254.   WriteCh('GenealogyFite','biz_dbase.html">'flags.htmlb'Scion')
  1255.   if VERSION > 0 then do
  1256.    WriteCh('GenealogyFile','V'VERSION)
  1257.    WriteCh('GenealogyFite','V'VERSION)
  1258.    end
  1259.   WriteLn('GenealogyFile',''flags.htmlub'</A> © 'flags.htmlb'Robbie J Akins'flags.htmlub') · ')
  1260.   WriteLn('GenealogyFite',''flags.htmlub'</A> © 'flags.htmlb'Robbie J Akins'flags.htmlub') · ')
  1261.   WriteCh('GenealogyFile','(<A href="http://wuarchive.wustl.edu/pub/aminet/')
  1262.   WriteCh('GenealogyFite','(<A href="http://wuarchive.wustl.edu/pub/aminet/')
  1263.   WriteCh('GenealogyFile','info/www/dirs/gfx_co')
  1264.   WriteCh('GenealogyFite','info/www/dirs/gfx_co')
  1265.   WriteLn('GenealogyFile','nv.html">'flags.htmlb'GfxCon'flags.htmlub'</A> © 'flags.htmlb'Dirk Farin'flags.htmlub') · ')
  1266.   WriteLn('GenealogyFite','nv.html">'flags.htmlb'GfxCon'flags.htmlub'</A> © 'flags.htmlb'Dirk Farin'flags.htmlub') · ')
  1267.   WriteCh('GenealogyFile','(<A href="http://wuarchive.wustl.edu/pub/aminet/')
  1268.   WriteCh('GenealogyFite','(<A href="http://wuarchive.wustl.edu/pub/aminet/')
  1269.   WriteCh('GenealogyFile','info/www/dirs/')
  1270.   WriteCh('GenealogyFite','info/www/dirs/')
  1271.   WriteCh('GenealogyFile','util_rexx.html">'flags.htmlb'Scion2html.rexx'flags.htmlub'</A> © ')
  1272.   WriteCh('GenealogyFite','util_rexx.html">'flags.htmlb'Scion2html.rexx'flags.htmlub'</A> © ')
  1273.   WriteLn('GenealogyFile',''flags.htmlb'Harold Ipolyi'flags.htmlub')')
  1274.   WriteLn('GenealogyFite',''flags.htmlb'Harold Ipolyi'flags.htmlub')')
  1275.   WriteCh('GenealogyFile','</Address>')
  1276.   WriteCh('GenealogyFite','</Address>')
  1277.   WriteLn('GenealogyFile','</HTML>')
  1278.   WriteLn('GenealogyFite','</HTML>')
  1279.   end
  1280.  
  1281.  Say ' '
  1282.  Say ' '
  1283.  Say ' If you have not already done so, add the following anchor pointing to'
  1284.  Say ' "'GetLastName(DBNAME)' Genealogy" to a HTML file (maybe HOME PAGE):  '
  1285.  Say ' '
  1286.  Say ' <A href="/'HTMLdir'/'flags.GenPrefix'L.htm">'GetLastName(DBNAME)' Genealogy</A>'
  1287.  Say ' '
  1288.  Say '          and maybe:'
  1289.  Say ' '
  1290.  
  1291.  GetPerComp(1)
  1292.  if flags.GenPrefix = "GENEAFI" then
  1293.   Say ' <A href="/'HTMLdir'/P1.htm">'person.GETFULLNAME.1'</A>'
  1294.  else
  1295.   Say ' <A href="/'HTMLdir'/'flags.GenPrefix'P1.htm">'person.GETFULLNAME.1'</A>'
  1296.  Say ' '
  1297.   end
  1298.  
  1299. /*
  1300.  Open('CreditsFile','ram:Credits.html','w')
  1301. */
  1302.  
  1303.  elapsedtime =  Time('e') - starttime
  1304.  
  1305.  spacer = substr(blanks,1,Length(elapsedtime))
  1306.  
  1307.  Say ' '
  1308.  Say '                                        'spacer'         '
  1309.  Say '  Scion2html.rexx completed normally in 'elapsedtime' seconds '
  1310.  Say '                                        'spacer'         '
  1311.  
  1312.  AskExit()
  1313.  
  1314.  EXIT    /* redundant */
  1315.  
  1316. /*************************************************************************
  1317. *                                                                        *
  1318. *  Makeone procedure extracts data and creates page for a single person  *
  1319. *                                                                        *
  1320. *************************************************************************/
  1321.  
  1322. MakeOne: PROCEDURE EXPOSE person. flags. DBPATH DBNAME AGdir HTMLdir TXTdir
  1323.  PARSE ARG ScionIRN
  1324.  
  1325. 'EXISTPERSON' ScionIRN
  1326. if RESULT = 'YES' then do
  1327.  
  1328.  if flags.GenPrefix = "GENEAFI" then do
  1329.   PersonPrefix = "P"            /* Person file name prefix */
  1330.   FamilyPrefix = "F"            /* Family file name prefix */
  1331.   end
  1332.  else do
  1333.   PersonPrefix = flags.GenPrefix"P"    /* Person file name prefix */
  1334.   FamilyPrefix = flags.GenPrefix"F"    /* Family file name prefix */
  1335.   end
  1336.  
  1337.  if FamilyPrefix = PersonPrefix then do
  1338.   say ' FamilyPrefix MUST NOT EQUAL PersonPrefix'
  1339.   say ' 'FamilyPrefix'                           'PersonPrefix
  1340.   AskExit()
  1341.   EXIT
  1342.   end
  1343.  
  1344.  HasFileFATHER = 0
  1345.  HasFileMOTHER = 0
  1346.  HasMOTHER = 0
  1347.  HasFATHER = 0
  1348.  HasPARENTS = 0
  1349.  HasCHILDREN = 0
  1350.  DoGenText = 0
  1351.  'GETPARENTS' ScionIRN
  1352.  PARENTS = RESULT
  1353.  tPARENTSt = 't'PARENTS't'
  1354. /* Say 'PARENTS = 'PARENTS tPARENTSt    ??? EXISTPARENTS IRN ??? */
  1355.  if tPARENTSt ~= 'tt' then HasPARENTS = 1
  1356.  'GETMARRIAGE' ScionIRN 0    /*      ??? GETTOTMARRIAGES IRN ???     */
  1357.  MARRIAGE = RESULT
  1358.  tMARRIAGESt = 't'MARRIAGE't'
  1359. /*    Say 'MARRIAGES = 'MARRIAGE tMARRIAGESt        */
  1360.  if tMARRIAGESt ~= 'tMARRIAGEt' then do
  1361.   mFGRN = MARRIAGE
  1362.   'GETNUMCHILD' mFGRN
  1363.   if RESULT > 0 then HasCHILDREN = 1
  1364.  end
  1365. /*
  1366. Say 'PARENTS = 'PARENTS tPARENTSt 'MARRIAGES = 'MARRIAGES tMARRIAGESt 'HasPARENTS = 'HasPARENTS 'HasCHILDREN = 'HasCHILDREN
  1367. */
  1368.  if flags.MakeText & ( HasPARENTS + HasCHILDREN ) = 1 then doGenText = 1
  1369.  
  1370.  GetPerComp(ScionIRN)
  1371.  
  1372.  if person.GETFULLNAME.ScionIRN = "" then return    /* nobody home */
  1373.  
  1374.  if ( flags.living > 0 ) & ( person.GETDEATHDATE.ScionIRN = "" ) then return 0
  1375.  
  1376.  'GETBAPTISMDATE' ScionIRN
  1377.  BAPTISMDATE = RESULT
  1378.  'GETRELIGION' ScionIRN
  1379.  RELIGION = RESULT
  1380.  'GETBAPTISMPLACE' ScionIRN
  1381.  BAPTISMPLACE = RESULT
  1382.  'GETBURIALPLACE' ScionIRN
  1383.  BURIALPLACE = RESULT
  1384.  'GETDIEDOF' ScionIRN
  1385.  DIEDOF = RESULT
  1386.  'GETEDUCATION' ScionIRN
  1387.  EDUCATION = RESULT
  1388.  'GETOCCUPATION' ScionIRN
  1389.  OCCUPATION = RESULT
  1390.  'GETPERSCOMMENT' ScionIRN
  1391.  PERSCOMMENT = RESULT
  1392.  'GETPERSREFS' ScionIRN
  1393.  PERSREFS = RESULT
  1394. /*
  1395.  ValidInfo = 0
  1396.  if LASTNAME||BIRTHDATE||BIRTHPLACE||DEATHDATE||DEATHPLACE||BURIALPLACE||RELIGION||DIEDOF||EDUCATION||OCCUPATION||PERSCOMMENT||PERSREFS ~= "" THEN ValidInfo = 1
  1397.  if ~ValidInfo then do
  1398. Say "Person " ScionIRN"'s lacking information; no new HTML file being created!"
  1399.   return
  1400.   end
  1401.  if flags.MakeText & ( ValidInfo | LASTNAME ~= "" ) then DoGenText = 1
  1402. */
  1403.  if flags.MakeText then DoGenText = 1
  1404.  PfilN = PersonPrefix || ScionIRN
  1405.  
  1406.  dPfilN = HTMLdir'/'PfilN
  1407.  gPfilN = AGdir'/'PfilN
  1408.  if flags.verbose then do
  1409.   Say ''
  1410.   Say ' HTML:  'dPfilN'.htm  for: 'person.GETFULLNAME.ScionIRN' {'ScionIRN'}'
  1411.   end
  1412.  else Say person.GETFULLNAME.ScionIRN' {'ScionIRN'}'
  1413.  Open('PERSONFILE',dPfilN'.htm','w')
  1414.  WriteLn('PERSONFILE','<HTML>')
  1415.  WriteLn('PERSONFILE','<TITLE>'person.GETFULLNAME.ScionIRN' Data Sheet</TITLE>')
  1416.  WriteLn('PERSONFILE','<BODY BACKGROUND="st0ne.gif">')
  1417.  WriteLn('PERSONFILE','<PRE><TT>')
  1418.  
  1419.  if flags.MakeGuide then do
  1420.   if flags.verbose then 
  1421.    Say 'Guide:  'gPfilN'.guide  for: 'person.GETFULLNAME.ScionIRN' {'ScionIRN'}'
  1422.   Open('PERSONGuide',gPfilN'.guide','w')
  1423.   WriteLn('PERSONGuide','@database "'gPfilN'.guide"')
  1424.   WriteLn('PERSONGuide','@NODE Main "'person.GETFULLNAME.ScionIRN' Genealogy"')
  1425.   WriteLn('PERSONGuide','@INDEX 'AGdir'/'flags.GenPrefix'L.guide/Main')
  1426.   WriteCh('PERSONGuide',person.GETFULLNAME.ScionIRN)
  1427.   end
  1428.  
  1429.  if Exists(DBPATH'PP'ScionIRN'.'DBNAME) & flags.DoPictures then do
  1430.   if flags.RemakeThumb then do
  1431.    DELETE(dPfilN'.GIF')
  1432.    DELETE(dPfilN'.JPEG')
  1433.    end
  1434.  
  1435.   if AgeTest(DBPATH'PP'ScionIRN'.'DBNAME, dPfilN'.jpg') then do
  1436.    Delete(dPfilN'.'flags.Thmbfmt)
  1437.    end
  1438.  
  1439.   WriteCh('PERSONFILE','   <A HREF="'PfilN'A.htm')
  1440.   WriteLn('PERSONFILE','"><img src="'PfilN'.'flags.Thmbfmt'"></A>')
  1441.   end
  1442.  
  1443.  WriteCh('PERSONFILE',person.MGETFULLNAME.ScionIRN)
  1444.  
  1445.  if Exists(DBPATH'PN'ScionIRN'.'DBNAME) then do
  1446.   if flags.verbose then Say 'Writing info ¶ file 'dPfilN'I.htm'
  1447.   Open('PNDBNAME',DBPATH'PN'ScionIRN'.'DBNAME,'r')
  1448.   Open('PERSONI',dPfilN'I.htm','w')
  1449.   if flags.MakeGuide then do
  1450.    if flags.verbose then Say 'Writing info ¶ file 'gPfilN'I.guide'
  1451.    Open('PERSONGI',gPfilN'I.guide','w')
  1452.    WriteLn('PERSONGI','@database "'gPfilN'I.guide"')
  1453.    WriteLn('PERSONGI','@NODE Main "'person.GETFULLNAME.ScionIRN' Information."')
  1454.    WriteLn('PERSONGI','@INDEX 'AGdir'/'flags.GenPrefix'L.guide/Main')
  1455.    end
  1456.   WriteLn('PERSONI','<HTML>')
  1457.   WriteLn('PERSONI','<TITLE>'person.GETFULLNAME.ScionIRN' Information</TITLE>')
  1458.   WriteLn('PERSONI','<BODY BACKGROUND="st0ne.gif">')
  1459.   WriteCh('PERSONI','<H3><A HREF="'PfilN'.htm">'person.MGETFULLNAME.ScionIRN)
  1460.   WriteCh('PERSONI','</A> Information. (<A HREF="'flags.GenPrefix'L.htm">')
  1461.   WriteLn('PERSONI',''flags.htmlb'Personae'flags.htmlub'</A>)</H3>')
  1462.   if DoGenText then
  1463.    WriteLn('GenealogyText','<h3>'person.PGETFULLNAME.ScionIRN' Information.</h3>')
  1464.   DO While ~EOF('PNDBNAME')
  1465.    line = ReadLn('PNDBNAME')
  1466.    WriteLn('PERSONI',CheckForReplacement(line))
  1467.    if flags.MakeGuide  | DoGenText then line = TagStrip(line)
  1468.    if flags.MakeGuide then WriteLn('PERSONGI',CheckGuideRepl(line))
  1469.    if DoGenText then WriteLn('GenealogyText',CheckForNAReplacement(line))
  1470.    end
  1471.   Close('PNDBNAME')
  1472.   if DoGenText then WriteLn('GenealogyText',' ')
  1473.   WriteLn('PERSONI','</HTML>')
  1474.   Close('PERSONI')
  1475.   if flags.MakeGuide then do
  1476.    WriteLn('PERSONGI','@ENDNODE')
  1477.    Close('PERSONGI')
  1478.    end
  1479.   WriteCh('PERSONFILE',' (<A HREF="'PfilN'I.htm"> ¶ </A>)')
  1480.   if flags.MakeGuide then
  1481.    WriteCh('PERSONGuide',' @{" More Info (¶) " LINK 'gPfilN'I.guide/Main}')   
  1482.   end
  1483.  
  1484.  if Exists(DBPATH'PP'ScionIRN'.'DBNAME) then do
  1485.   if flags.MakeGuide then do
  1486.    WriteCh('PERSONGuide',' @{" Picture (®) " RXS "address command ')
  1487.    WriteCh('PERSONGuide',"'"flags.VIEWER" ")
  1488.    WriteCh('PERSONGuide',DBPATH'PP'ScionIRN'.'DBNAME"'"'"')
  1489.    WriteCh('PERSONGuide','}')
  1490.    end
  1491.  
  1492.   if flags.DoPictures then do
  1493.    if ~Exists(dPfilN'.jpg') then do
  1494.     Say 'Creating picture 'dPfilN'.jpg'
  1495. /*
  1496. Say 'Sys:Tools/GfxCon 'DBPATH'PP'ScionIRN'.'DBNAME' TO 'dPfilN'.jpg FORMAT JPEG QUALITY 100'
  1497. */
  1498. Say 'Sys:Tools/GfxCon 'DBPATH'PP'ScionIRN'.'DBNAME' TO 'dPfilN'.jpg FORMAT JPEG QUALITY 100'
  1499. OldStackSize = pragma('s',21000)
  1500. address command 'Sys:Tools/GfxCon 'DBPATH'PP'ScionIRN'.'DBNAME' TO 'dPfilN'.jpg FORMAT JPEG QUALITY 100'
  1501. call pragma('s',OldStackSize)
  1502.     end
  1503.    if Exists(dPfilN'.'flags.Thmbfmt) then do
  1504.     if flags.verbose then Say '  ~ image 'dPfilN'.'flags.Thmbfmt'  ...OK... '
  1505.     end
  1506.    else do
  1507.     if flags.verbose then Say 'Creating image 'dPfilN'.'flags.Thmbfmt
  1508. /*
  1509. Say 'Sys:Tools/GfxCon 'DBPATH'PP'ScionIRN'.'DBNAME' TO 'dPfilN'.'flags.Thmbfmt' FORMAT 'flags.Thmbfmt' BOXFIT 'flags.Thumbnail' 'flags.Thumbnail
  1510. */
  1511. Say 'Sys:Tools/GfxCon 'DBPATH'PP'ScionIRN'.'DBNAME' TO 'dPfilN'.'flags.Thmbfmt' FORMAT 'flags.Thmbfmt' BOXFIT 'flags.Thumbnail' 'flags.Thumbnail
  1512. OldStackSize = pragma('s',21000)
  1513. address command 'Sys:Tools/GfxCon 'DBPATH'PP'ScionIRN'.'DBNAME' TO 'dPfilN'.'flags.Thmbfmt' FORMAT 'flags.Thmbfmt' BOXFIT 'flags.Thumbnail' 'flags.Thumbnail
  1514. call pragma('s',OldStackSize)
  1515.     end                   
  1516. WriteCh('PERSONFILE',' (<A HREF="'PfilN'A.htm">'flags.htmlb' ® 'flags.htmlub'</A>)')
  1517.    if Exists(dPfilN'A.htm') then do
  1518.     if flags.verbose then Say '  ~ picture album 'dPfilN'A.htm  ...OK... '
  1519.     end
  1520.    else do
  1521.     Say 'Creating picture album ® 'dPfilN'A.htm'
  1522.     Open('PERSONP',dPfilN'A.htm','w')
  1523.     WriteLn('PERSONP','<HTML>')
  1524.     WriteLn('PERSONP','<TITLE>'person.GETFULLNAME.ScionIRN' Picture Album</TITLE>')
  1525.     WriteLn('PERSONP','<BODY BACKGROUND="st0ne.gif">')
  1526.     WriteCh('PERSONP',person.MGETFULLNAME.ScionIRN' . ')
  1527.     WriteCh('PERSONP','<A HREF="'PfilN'.jpg">')
  1528.     WriteLn('PERSONP','<img src="'PfilN'.'flags.Thmbfmt'"></A>')
  1529.     WriteLn('PERSONP',' . 'flags.htmlb'Picture Album'flags.htmlub'<HR><pre><tt>')
  1530.     WriteCh('PERSONP','<H3>another JPEG picture <A HREF="'PfilN'A1.jpg">')
  1531.     WriteCh('PERSONP','<img src="'PfilN'A1.'flags.Thmbfmt'"></A> anchored by ')
  1532.     WriteLn('PERSONP','thumbnail image created by:')
  1533.     WriteCh('PERSONP','GfxCon 'dPfilN'A1.jpg TO 'dPfilN'A1.'flags.Thmbfmt' FORMAT ')
  1534.     WriteCh('PERSONP',flags.Thmbfmt' BOXFIT 'flags.Thumbnail' 'flags.Thumbnail)
  1535.     WriteLn('PERSONP','<HR></pre></tt>')
  1536.     WriteLn('PERSONP',''flags.htmlb'Edit'flags.htmlub' 'dPfilN'A.htm 'flags.htmlb'to add more pictures to the Picture Album<P>')
  1537.     WriteCH('PERSONP','CAUTION: deleting Directory:'flags.htmlub' 'HTMLdir' 'flags.htmlb'destroys all Picture ')
  1538.     WriteLn('PERSONP',' Album modifications. YOUR WORK WILL BE LOST!'flags.htmlub'')
  1539.     WriteLn('PERSONP','</HTML>')
  1540.     Close('PERSONP')
  1541.     end
  1542.    end
  1543.   end
  1544.  
  1545.  WriteLn('PERSONFILE',' (<A HREF="'flags.GenPrefix'L.htm">'flags.htmlb'Personae'flags.htmlub'</A>)')
  1546.  
  1547. /*
  1548.  if flags.MakeGuide then do
  1549.   WriteLn('PERSONGuide',' @{" List of People " LINK 'AGdir'/'flags.GenPrefix'L.guide/Main}')
  1550.   end    */
  1551.  
  1552.  if flags.MakeGuide then WriteLn('PERSONGuide','')
  1553.  
  1554.  if DoGenText then do
  1555.   if flags.target ~= "NORMAL" then
  1556.    Say 'ASCII:  'TXTdir'/G'ScionIRN'  for 'person.GETFULLNAME.ScionIRN' {'ScionIRN'}'
  1557.   WriteLn('GenealogyText','')
  1558.   WriteLn('GenealogyText','-----------------------------------------------------------')
  1559.   WriteLn('GenealogyText','')
  1560.   WriteLn('GenealogyText',person.PGETFULLNAME.ScionIRN' Data Sheet')
  1561.   end
  1562.  if person.GETBIRTHDATE.ScionIRN || person.GETBIRTHPLACE.ScionIRN ~= "" then do
  1563.   if person.GETBIRTHDATE.ScionIRN ~= "" then
  1564.    PersOutputCh('Born: 'person.GETBIRTHDATE.ScionIRN' * ',0)
  1565.   if person.GETBIRTHPLACE.ScionIRN ~= "" then
  1566.    PersOutputCh(person.GETBIRTHPLACE.ScionIRN,0)
  1567.   PersOutputCr()
  1568.   end
  1569.  if BAPTISMDATE || BAPTISMPLACE || RELIGION ~= "" then do
  1570.   PersOutputCh('Baptised: ')
  1571.   PersOutputCh(BAPTISMDATE' ')
  1572.   if RELIGION ~= "" then PersOutputCh('{'RELIGION'} ',0)
  1573.   if BAPTISMPLACE ~= "" then PersOutputCh(BAPTISMPLACE,0)
  1574.   PersOutputCr()
  1575.   end
  1576.  if person.GETDEATHDATE.ScionIRN ~= "" & person.GETDEATHDATE.ScionIRN ~= "dead" then do
  1577.   PersOutputCh('Died: 'person.GETDEATHDATE.ScionIRN,0)
  1578.   if person.GETDEATHPLACE.ScionIRN ~= "" then
  1579.    PersOutputCh(' + 'person.GETDEATHPLACE.ScionIRN,0)
  1580.   if BURIALPLACE ~= "" then PersOutputCh(' . Buried: 'BURIALPLACE,0)
  1581.   PersOutputCr()
  1582.   end
  1583.  else do
  1584.   if person.GETDEATHPLACE.ScionIRN ~= "" then
  1585.    PersOutputLn(person.GETDEATHPLACE.ScionIRN,1)
  1586.   if BURIALPLACE ~= "" then PersOutputLn(BURIALPLACE,1)
  1587.   end
  1588.  if DIEDOF ~= "" then PersOutputLn('Cause of Death: 'DIEDOF,1)
  1589.  if EDUCATION ~= "" then PersOutputLn('Education: 'EDUCATION,1)
  1590.  if OCCUPATION ~= "" then PersOutputLn('Occupation: 'OCCUPATION,1)
  1591.  if PERSCOMMENT ~= "" then PersOutputLn('Comments: 'PERSCOMMENT,1)
  1592.  if PERSREFS ~= "" then PersOutputLn('References: 'PERSREFS,1)
  1593.  
  1594. /* end of personal data; start family tree segment */
  1595.  
  1596.  PersOutputHL()
  1597.  HeadLine = ''
  1598.  if HasPARENTS then HeadLine = HeadLine' ·Parents '
  1599.  'GETNUMSIB' ScionIRN
  1600.  xtra = ''
  1601.  if RESULT > 1 then xtra = 's'
  1602.  if RESULT > 0 then HeadLine = HeadLine' ·Sibling'xtra' '
  1603.  'GETNUMMARRY' ScionIRN
  1604.  xtra = ''
  1605.  if RESULT > 1 then xtra = 's'
  1606.  if RESULT > 0 then HeadLine = HeadLine' ·Spouse'xtra' '
  1607.  'GETTOTALCHILD' ScionIRN
  1608.  xtra = 'Child'
  1609.  if RESULT > 1 then xtra = xtra'ren'
  1610.  if RESULT > 0 then HeadLine = HeadLine' ·'xtra
  1611.  PersOutputLn('Immediate Family: 'HeadLine,0)
  1612.  if DoGenText then WriteLn('GenealogyText','')
  1613.  if HasPARENTS then do
  1614.   'GETPRINCIPAL' PARENTS
  1615.   PRINCIPAL = RESULT
  1616.   'GETSPOUSE' PARENTS
  1617.   SPOUSE = RESULT
  1618.   'GETMARRYDATE' PARENTS
  1619.   PARENTSMARRIAGEDATE = RESULT
  1620.   'GETMARRYPLACE' PARENTS
  1621.   PARENTSmFGRNPLACE = RESULT
  1622.   'GETSEX' PRINCIPAL
  1623.   if RESULT = 'M' then do
  1624.    FATHERIRN = PRINCIPAL
  1625.    MOTHERIRN = SPOUSE
  1626.    end
  1627.   else do
  1628.    FATHERIRN = SPOUSE
  1629.    MOTHERIRN = PRINCIPAL
  1630.    end
  1631.   GetPerComp(FATHERIRN)
  1632.   if person.GETFIRSTNAME.FATHERIRN||person.GETLASTNAME.FATHERIRN ~= "" then
  1633.    HasFATHER = 1
  1634.   GetPerComp(MOTHERIRN)
  1635.   if person.GETFIRSTNAME.MOTHERIRN||person.GETLASTNAME.MOTHERIRN ~= "" then
  1636.    HasMOTHER = 1
  1637.  
  1638.   if FATHERLASTNAME ~= "" then do
  1639.    HasFileFATHER = 1
  1640.    FATHERFILENAME = PersonPrefix || FATHERIRN
  1641.    end
  1642.  
  1643.   if MOTHERLASTNAME ~= "" then do
  1644.    HasFileMOTHER = 1
  1645.    MOTHERFILENAME = PersonPrefix || MOTHERIRN
  1646.    end
  1647.  
  1648.   if HasFileFATHER then do
  1649.    PersOutputCh('  <'FATHERIRN'>',1)
  1650. /*
  1651.    if PARENTSMARRIAGEDATE ~= "" then PersOutputCh(' X ',0)
  1652.    else PersOutputCh(' & ',0)
  1653. */
  1654.    PersOutputCh(' & ',0)
  1655.    end
  1656.   PersOutputCh('<'MOTHERIRN'>',1)
  1657.   if ( flags.living = 0 ) then do
  1658.    if ( person.GETDEATHDATE.FATHERIRN||person.GETDEATHDATE.MOTHERIRN = "" ) then do
  1659.  
  1660.     if PARENTSMARRIAGEDATE ~= "" then PersOutputCh(' x 'PARENTSMARRIAGEDATE,0)
  1661.     if PARENTSmFGRNPLACE ~= "" then PersOutputCh(' @ 'PARENTSmFGRNPLACE,0)
  1662.     end
  1663.    end
  1664.   PersOutputCr()
  1665.   spcs = '  |'
  1666.   DO i = 0 TO Length(FATHERFULLNAME) /* ################ */
  1667.    spcs = spcs' '     /* ??? GETFAMLBL1 ??? */
  1668.   end            /* ??? GETFAMLBL2 ??? */
  1669.  
  1670.  Minfo = Exists(DBPATH'FN'PARENTS'.'DBNAME)
  1671.  if PARENTSmFGRNCELEBRANT ~= '' | Minfo then do
  1672.   if DoGenText then WriteLn('GenealogyText','  |')   
  1673.   'GETNUMCHILD' PARENTS
  1674.   TOTCHILDREN = RESULT
  1675. /* say 'TOTCHILDREN = 'TOTCHILDREN */
  1676.   DO i = 0 TO TOTCHILDREN - 1
  1677.    'GETCHILD' PARENTS i
  1678.    PARENTSc = RESULT
  1679.    GetPerComp(PARENTSc)
  1680.    if person.GETFIRSTNAME.PARENTSc ~= "" then do
  1681.     if PARENTSc ~= ScionIRN then do
  1682.      LastNameFl = 1
  1683.      if person.GETLASTNAME.PARENTSc = person.GETLASTNAME.FATHERIRN then do
  1684.       LastNameFl = -1
  1685.       LastNameVal = person.GETLASTNAME.FATHERIRN
  1686.       end
  1687.      PersOutputCh('  |_',0)
  1688.      PersOutputCh('<'PARENTSc'>',LastNameFl)
  1689.      LastNameFl = 1
  1690.      BirthDeath(PARENTSc)
  1691.      PersOutputCr()
  1692.      end
  1693.     end
  1694.    end
  1695.   end
  1696.   PersOutputLn('  |',0)
  1697.  END
  1698.  
  1699. /* end of parents, siblings segment; start marriages segment */
  1700.  
  1701. vert.0 = ''
  1702. vert.1 = '|'
  1703. 'GETNUMMARRY' ScionIRN
  1704. TOTMARRIAGES = RESULT
  1705. /* say 'TOTMARRIAGES = 'TOTMARRIAGES */
  1706. DO i = 0 TO TOTMARRIAGES
  1707.  'GETMARRIAGE' ScionIRN i
  1708.  MARRIAGE = RESULT               /* use: 'EXISTFAMILY'   */
  1709.  if MARRIAGE > -1 then do
  1710.   MARRIAGES = i
  1711.   j = i + 1
  1712.   vert.j = vert.1||vert.i
  1713.   end
  1714.  end
  1715. tMARRIAGESt = 't'MARRIAGES't'
  1716.  PersOutputCh('  |_',0) 
  1717.  if tMARRIAGESt ~= 'tMARRIAGESt' then do
  1718.   DO i = 0 TO MARRIAGES
  1719.    'GETMARRIAGE' ScionIRN i
  1720.    mFGRN = RESULT
  1721.    if mFGRN ~= "" then do
  1722.     ki = MARRIAGES - i + 1
  1723.     if ki ~= MARRIAGES + 1 then PersOutputLn('    'vert.ki,0)
  1724.     j = MARRIAGES + 1 - i
  1725.     'GETSPOUSE' mFGRN
  1726.     SPOUSE = RESULT
  1727.     GetPerComp(SPOUSE)
  1728.     if SPOUSE = ScionIRN then do
  1729.      'GETPRINCIPAL' mFGRN
  1730.      SPOUSE = RESULT
  1731.      end
  1732.     'GETMARRYDATE' mFGRN
  1733.     MARRIAGEDATE = RESULT
  1734.     'GETMARRYPLACE' mFGRN
  1735.     mFGRNPLACE = RESULT
  1736.  
  1737.     SPOUSEFILENAME = PersonPrefix || SPOUSE
  1738.  
  1739.     if i = 0 then do
  1740. /*
  1741.      if MARRIAGEDATE ~= "" then PersOutputCh('<'ScionIRN'> X ',1)
  1742.      else PersOutputCh('<'ScionIRN'> & ',1)
  1743. */
  1744.      PersOutputCh('<'ScionIRN'> & ',1)
  1745.      PersOutputCh('<'SPOUSE'>',1)
  1746.      end
  1747.  
  1748.     else do
  1749. /*
  1750.      if ( MARRIAGEDATE ~= "" ) then PersOutputCh('    'vert.j'_X',0)
  1751.      else PersOutputCh('    'vert.j'_&',0)
  1752. */
  1753.      PersOutputCh('    'vert.j'_&',0)
  1754.      PersOutputCh('<'SPOUSE'>',1)
  1755.      end
  1756.  
  1757.     blockinfo = ( flags.living > 0 ) & ( person.GETDEATHDATE.SPOUSE = "" )
  1758.  
  1759.     if ~blockinfo then do
  1760.  
  1761.      if MARRIAGEDATE ~= "" then PersOutputCh(' x 'MARRIAGEDATE,0)
  1762.      if mFGRNPLACE ~= "" then PersOutputCh(' @ 'mFGRNPLACE,0)
  1763.      PersOutputCr()
  1764.      jk = MARRIAGES - i
  1765.      spcs = '    'vert.jk'    |'
  1766.  
  1767.      FfilN = HTMLdir'/'FamilyPrefix || mFGRN
  1768.      Minfo = 0
  1769.      if Exists(DBPATH'FN'mFGRN'.'DBNAME) then do
  1770.       Minfo = 1
  1771.  
  1772.       if AgeTest(DBPATH'FN'mFGRN'.'DBNAME,FfilN'I.htm') then do
  1773.        Say 'Writing info ¶ file 'FfilN'I.htm'
  1774.        Open('FNDBNAME',DBPATH'FN'mFGRN'.'DBNAME,'r')
  1775.        Open('FAMILYI',FfilN'I.htm','w')
  1776.        WriteLn('FAMILYI','<HTML>')
  1777.        WriteCh('FAMILYI','<TITLE>'person.MGETFULLNAME.ScionIRN' & ')
  1778.        WriteLn('FAMILYI',person.MGETFULLNAME.SPOUSE' Family Information</TITLE>') 
  1779.        WriteLn('FAMILYI','<BODY BACKGROUND="st0ne.gif">')
  1780.  
  1781.        if Exists(DBPATH'FP'mFGRN'.'DBNAME) & flags.DoPictures then do
  1782.         WriteCh('FAMILYI','<A HREF="'FamilyPrefix || mFGRN'A.htm')
  1783.         WriteCh('FAMILYI','"><img src="'FamilyPrefix || mFGRN'.'flags.Thmbfmt'"></A>')
  1784.         end
  1785.  
  1786.        WriteCh('FAMILYI','<H3>Family of 'person.MGETFULLNAME.ScionIRN' & ')
  1787.        
  1788.        if SPOUSE ~= '' then WriteCh('FAMILYI',person.MGETFULLNAME.SPOUSE)
  1789.        else WriteCh('FAMILYI','______')
  1790.  
  1791.        if Exists(DBPATH'FP'mFGRN'.'DBNAME) & flags.DoPictures then do
  1792.         WriteCh('FAMILYI',' (<A HREF="'FamilyPrefix || mFGRN'A.htm')
  1793.         WriteCh('FAMILYI','">'flags.htmlb' ® 'flags.htmlub'</A>) ')
  1794.         end
  1795.  
  1796.        WriteCh('FAMILYI',' (<A HREF="'flags.GenPrefix'L.htm">')
  1797.        WriteLn('FAMILYI',''flags.htmlb'Personae'flags.htmlub'</A>)</H2>')
  1798.        DO While ~EOF('FNDBNAME')
  1799.         line = ReadLn('FNDBNAME')
  1800.         WriteLn('FAMILYI',CheckForReplacement(line))
  1801. /*
  1802. if DoGenText then WriteLn('GenealogyText',spcs'  'CheckForNAReplacement(line))
  1803. */
  1804.         end
  1805.        Close('FNDBNAME')
  1806.        WriteLn('FAMILYI','</HTML>')
  1807.        Close('FAMILYI')
  1808.        end
  1809.       end
  1810.  
  1811.      Palbum = 0
  1812.      if Exists(DBPATH'FP'mFGRN'.'DBNAME) & flags.DoPictures then do
  1813.  
  1814.       Palbum = 1
  1815.       if flags.RemakeThumb then do
  1816.        DELETE(FfilN'.GIF')
  1817.        DELETE(FfilN'.JPEG')
  1818.        end
  1819.       if AgeTest(DBPATH'FP'mFGRN'.'DBNAME,FfilN'.jpg') then do
  1820.        Delete(FfilN'.'flags.Thmbfmt)
  1821.        end
  1822.  
  1823.       if flags.DoPictures & ~Exists(FfilN'.jpg') then do
  1824.        Say 'Creating picture 'FfilN'.jpg'
  1825. /*
  1826. Say 'Sys:Tools/GfxCon 'DBPATH'FP'mFGRN'.'DBNAME' TO 'FfilN'.jpg FORMAT JPEG QUALITY 100'
  1827. */
  1828. Say 'Sys:Tools/GfxCon 'DBPATH'FP'mFGRN'.'DBNAME' TO 'FfilN'.jpg FORMAT JPEG QUALITY 100'
  1829. OldStackSize = pragma('s',21000)
  1830. address command 'Sys:Tools/GfxCon 'DBPATH'FP'mFGRN'.'DBNAME' TO 'FfilN'.jpg FORMAT JPEG QUALITY 100'
  1831. call pragma('s',OldStackSize)
  1832.        end
  1833.       if Exists(FfilN'.'flags.Thmbfmt) then do
  1834.        if flags.verbose then Say '  ~ image 'FfilN'.'flags.Thmbfmt'  ...OK... '
  1835.       end
  1836.       else do
  1837.        if flags.verbose then Say 'Creating image 'FfilN'.'flags.Thmbfmt''
  1838. /*
  1839. Say 'Sys:Tools/GfxCon 'DBPATH'FP'mFGRN'.'DBNAME' TO 'FfilN'.'flags.Thmbfmt' FORMAT 'flags.Thmbfmt' BOXFIT 'flags.Thumbnail' 'flags.Thumbnail
  1840. */
  1841. Say 'Sys:Tools/GfxCon 'DBPATH'FP'mFGRN'.'DBNAME' TO 'FfilN'.'flags.Thmbfmt' FORMAT 'flags.Thmbfmt' BOXFIT 'flags.Thumbnail' 'flags.Thumbnail
  1842. OldStackSize = pragma('s',21000)
  1843. address command 'Sys:Tools/GfxCon 'DBPATH'FP'mFGRN'.'DBNAME' TO 'FfilN'.'flags.Thmbfmt' FORMAT 'flags.Thmbfmt' BOXFIT 'flags.Thumbnail' 'flags.Thumbnail
  1844. call pragma('s',OldStackSize)
  1845.        end
  1846.       if Exists(FfilN'A.htm') then do
  1847.        if flags.verbose then Say '  ~ picture album 'FfilN'A.htm  ...OK... '
  1848.        end
  1849.       else do
  1850.        Say 'Creating picture album ® 'FfilN'A.htm'
  1851.        Open('FAMILYP',FfilN'A.htm','w')
  1852. WriteLn('FAMILYP','<HTML>')
  1853. WriteCh('FAMILYP','<TITLE>'person.MGETFULLNAME.ScionIRN' & ')
  1854. WriteCh('FAMILYP',person.MGETFULLNAME.SPOUSE)
  1855. WriteLn('FAMILYP',' Family Picture Album</TITLE>')
  1856. WriteLn('FAMILYP','<BODY BACKGROUND="st0ne.gif">')
  1857. WriteCh('FAMILYP',person.MGETFULLNAME.ScionIRN' & ')
  1858. WriteCh('FAMILYP',person.MGETFULLNAME.SPOUSE)
  1859. WriteCh('FAMILYP',' 'flags.htmlb'Family'flags.htmlub' . ')
  1860. WriteCh('FAMILYP','<A HREF="'FamilyPrefix || mFGRN'.jpg">')
  1861. WriteCh('FAMILYP','<img src="'FamilyPrefix || mFGRN'.'flags.Thmbfmt'"></A>')
  1862. WriteLn('FAMILYP',' . 'flags.htmlb' Picture Album 'flags.htmlub'<HR><pre><tt>')
  1863. WriteCh('FAMILYP','another JPEG picture <A HREF="'FamilyPrefix || mFGRN)
  1864. WriteCh('FAMILYP','A1.jpg"><img src="')
  1865. WriteCh('FAMILYP',FamilyPrefix || mFGRN'A1.'flags.Thmbfmt'"></A> anchored by ')
  1866. WriteLn('FAMILYP','thumbnail image created by:')
  1867. WriteCh('FAMILYP','GfxCon 'FfilN'A1.jpg TO 'FfilN'A1.'flags.Thmbfmt' FORMAT ')
  1868. WriteCh('FAMILYP',flags.Thmbfmt' BOXFIT 'flags.Thumbnail' 'flags.Thumbnail)
  1869. WriteLn('FAMILYP','<HR></pre></tt>')
  1870. WriteLn('FAMILYP',''flags.htmlb'Edit'flags.htmlub' 'FfilN'A.htm 'flags.htmlb'to add more pictures to the Picture Album<P>')
  1871. WriteCH('FAMILYP','CAUTION: deleting Directory:'flags.htmlub' 'HTMLdir' 'flags.htmlb'destroys all Picture ')
  1872. WriteLn('FAMILYP',' Album modifications. YOUR WORK WILL BE LOST!'flags.htmlub'')
  1873. WriteLn('FAMILYP','</HTML>')
  1874.        Close('FAMILYP')
  1875.        end
  1876.       end
  1877.  
  1878.      if MARRIAGECELEBRANT ~= '' | Minfo | Palbum then do
  1879.       if Minfo then
  1880.        WriteCh('PERSONFILE',spcs'(<A HREF="'FamilyPrefix || mFGRN'I.htm"> ¶ </A>) ')
  1881.  
  1882.       if Exists(DBPATH'FP'mFGRN'.'DBNAME) & flags.DoPictures then do
  1883.        WriteCh('PERSONFILE',' (<A HREF="'FamilyPrefix || mFGRN'A.htm')
  1884.        WriteCh('PERSONFILE','">'flags.htmlb' ® 'flags.htmlub'</A>) ')
  1885.        end
  1886.  
  1887.       if Exists(DBPATH'FP'mFGRN'.'DBNAME) & flags.MakeGuide then do
  1888.        WriteCh('PERSONGuide',spcs' @{" Picture (®) " RXS "address command ')
  1889.        WriteCh('PERSONGuide',"'"flags.VIEWER" ")
  1890.        WriteCh('PERSONGuide',DBPATH'FP'mFGRN'.'DBNAME"'"'"')
  1891.        WriteLN('PERSONGuide','}')
  1892.        end
  1893.  
  1894.       if ( Exists(DBPATH'FP'mFGRN'.'DBNAME) & flags.DoPictures ) | Minfo then 
  1895.        WriteLn('PERSONFILE',' ')
  1896.  
  1897.       'GETCELEBRANT' mFGRN
  1898.       if RESULT ~= "" then PersOutputLn(spcs' Celebrant: 'RESULT,1)
  1899.       'GETWITNESS' mFGRN
  1900.       if RESULT ~= "" then PersOutputLn(spcs'   Witness: 'RESULT,1)
  1901.       'GETFAMCOMMENT' mFGRN
  1902.       if RESULT ~= "" then PersOutputLn(spcs'  Comments: 'RESULT,1)
  1903.       'GETENDDATE' mFGRN
  1904.       ENDDATE = RESULT
  1905.       'GETENDING' mFGRN
  1906.       ENDING = RESULT
  1907.       if ENDDATE ~= "" | ENDING > 0 then do
  1908.        PersOutputCh(spcs,0)
  1909.        PersOutputCh('     Ended: ',0)
  1910.        if ENDDATE ~= "" then PersOutputCh(ENDDATE,0)
  1911.        if ENDING = 1 then PersOutputCh(' · None',0)
  1912.        if ENDING = 2 then PersOutputCh(' · Divorce',0)
  1913.        if ENDING = 3 then PersOutputCh(' · Separation',0)
  1914.        if ENDING = 4 then PersOutputCh(' · Annulment',0)
  1915.        if ENDING = 5 then PersOutputCh(' · Death',0)
  1916.        PersOutputCr()
  1917.        end
  1918.  
  1919.       'GETFAMREFS' mFGRN
  1920.       if RESULT ~= "" then PersOutputLn(spcs'References: 'RESULT,1)
  1921.  
  1922.       if DoGenText then WriteLn('GenealogyText',spcs)
  1923.  
  1924.       if Minfo & ( DoGenText | flags.MakeGuide ) then do
  1925.        if flags.MakeGuide then WriteLn('PERSONGuide',spcs)
  1926.        Open('FNDBNAME',DBPATH'FN'mFGRN'.'DBNAME,'r')
  1927.        DO While ~EOF('FNDBNAME')
  1928.         line = TagStrip(ReadLn('FNDBNAME'))
  1929.         if flags.MakeGuide then WriteLn('PERSONGuide',spcs'  'CheckGuideRepl(line))
  1930.         if DoGenText then 
  1931.          WriteLn('GenealogyText',spcs'  'CheckForNAReplacement(line))
  1932.         end
  1933.        Close('FNDBNAME')
  1934.        end
  1935.       end
  1936.      end
  1937.     else do
  1938.      PersOutputCr()
  1939.      end
  1940.  
  1941.      'GETNUMCHILD' mFGRN
  1942.      TOTCHILDREN = RESULT
  1943. /* say 'TOTCHILDREN = 'TOTCHILDREN */
  1944.      DO k = 0 TO TOTCHILDREN - 1
  1945.       'GETCHILD' mFGRN k
  1946.       mFGRNc = RESULT
  1947.  
  1948.       GetPerComp(mFGRNc)
  1949.  
  1950.       if person.GETFIRSTNAME.mFGRNc ~= "" then do
  1951.        HasCHILDREN = 1
  1952.  
  1953.        jk = MARRIAGES - i
  1954.        LastNameFl = 1
  1955.        if person.GETLASTNAME.mFGRNc = person.GETLASTNAME.ScionIRN then do
  1956.         LastNameFl = -1
  1957.         LastNameVal = person.GETLASTNAME.ScionIRN
  1958.         end
  1959.        PersOutputCh('    'vert.jk'    |_<'mFGRNc'>',LastNameFl)
  1960.        LastNameFl = 1
  1961.        BirthDeath(mFGRNc)
  1962.        PersOutputCr()
  1963.        end
  1964.       end
  1965.      end
  1966.     end
  1967.   end
  1968.  else do
  1969.   LastNameFl = 1
  1970.   if LASTNAME = FATHERLASTNAME then do
  1971.   LastNameFl = -1
  1972.    LastNameVal = FATHERLASTNAME
  1973.    end
  1974.   PersOutputLn('<'ScionIRN'>',1)
  1975.   LastNameFl = 1
  1976.  end
  1977.  
  1978.  if HasPARENTS then do
  1979.   if flags.verbose then say ' Ancestors...'
  1980.   PersOutputHL()
  1981.   PersOutputLn('Ancestors',0)
  1982.   if DoGenText then WriteLn('GenealogyText','')
  1983.   Paternal(ScionIRN,'  ')
  1984.   PersOutputCh('<'ScionIRN'>',1)
  1985.   if person.GETBIRTHDATE.ScionIRN ~= "" then
  1986.    PersOutputCh(' * 'person.GETBIRTHDATE.ScionIRN,0)
  1987.   if person.GETDEATHDATE.ScionIRN ~= "" & person.GETDEATHDATE.ScionIRN ~= "dead" then
  1988.    if person.GETDEATHDATE.ScionIRN ~= "?" then
  1989.     PersOutputCh(' + 'person.GETDEATHDATE.ScionIRN,0)
  1990.   PersOutputCr()
  1991.   Maternal(ScionIRN,'  ')
  1992.   end
  1993.  
  1994.  if HasCHILDREN then do
  1995.   if flags.verbose then say ' Descendants...'
  1996.   PersOutputHL()
  1997.   indent = "  "
  1998.   PersOutputLn('Descendants',0)
  1999.   if DoGenText then WriteLn('GenealogyText','')
  2000.   PersOutputCh(indent'<'ScionIRN'>',1)
  2001.   if person.GETBIRTHDATE.ScionIRN ~= "" then
  2002.    PersOutputCh(' * 'person.GETBIRTHDATE.ScionIRN,0)
  2003.   if person.GETDEATHDATE.ScionIRN ~= "" & person.GETDEATHDATE.ScionIRN ~= "dead" then
  2004.    if person.GETDEATHDATE.ScionIRN ~= "?" then
  2005.     PersOutputCh(' + 'person.GETDEATHDATE.ScionIRN,0)
  2006.   PersOutputCr()
  2007.   marriagesANDchildren(ScionIRN,indent)
  2008.   end
  2009. /*©*/
  2010.  WriteLn('PERSONFILE','</TT></PRE>')
  2011.  WriteLn('PERSONFILE','</HTML>')
  2012.  Close('PERSONFILE')
  2013.  if flags.MakeGuide then do
  2014.   WriteLn('PERSONGuide','@ENDNODE')
  2015.   Close('PERSONGuide')
  2016.   end
  2017. /*©*/
  2018. /*
  2019.  if flags.target = "NORMAL" & ValidInfo then do
  2020. */
  2021.  if flags.target = "NORMAL" then do
  2022.   if DoGenText then WriteLn('GenealogyText',' ')
  2023.   WriteLn('GenealogyFite','<tr><td align=center>')
  2024.   GeneaOutputCh('<'ScionIRN'>',1)
  2025.   WriteLn('GenealogyFite','</td>')
  2026.   WriteLn('GenealogyFite','<td align=right>')
  2027.   if person.GETBIRTHDATE.ScionIRN ~= "" then
  2028.    GeneaOutputCh('  *',0)
  2029.    GeneaOutputCh(person.GETBIRTHDATE.ScionIRN,0)
  2030.   WriteLn('GenealogyFite','</td>')
  2031.   WriteLn('GenealogyFite','<td align=right>')
  2032.   if person.GETDEATHDATE.ScionIRN ~= "" & person.GETDEATHDATE.ScionIRN ~= "dead" then
  2033.    if person.GETDEATHDATE.ScionIRN ~= "?" then
  2034.     GeneaOutputCh('  +',0)
  2035.     GeneaOutputCh(person.GETDEATHDATE.ScionIRN,0)
  2036.   WriteLn('GenealogyFite','</td>')
  2037.   if HasFATHER then do
  2038.    WriteLn('GenealogyFite','<td align=center>')
  2039.    GeneaOutputCh('  · ',0)
  2040.    GeneaOutputCh('<'FATHERIRN'>',1)
  2041.    WriteLn('GenealogyFite','</td>')
  2042.    WriteLn('GenealogyFite','<td align=center>')
  2043.    if HasMOTHER then do
  2044.     GeneaOutputCh('  & ',0)
  2045.     GeneaOutputCh('<'MOTHERIRN'>',1)
  2046.     end
  2047.    WriteLn('GenealogyFite','</td></tr>')
  2048.    end
  2049.   else do
  2050.    WriteLn('GenealogyFite','<td align=center>')
  2051.    WriteLn('GenealogyFite','</td>')
  2052.    WriteLn('GenealogyFite','<td align=center>')
  2053.    if HasMOTHER then do
  2054.     GeneaOutputCh('  · ',0)
  2055.     GeneaOutputCh('<'MOTHERIRN'>',1)
  2056.     end
  2057.    end
  2058.   WriteLn('GenealogyFite','</td></tr>')
  2059.   GeneaOutputCr() /* do not close, we have many more to go. */
  2060.   end
  2061.  return
  2062.  
  2063.  
  2064.  
  2065.  
  2066.  
  2067. IsNumeric: PROCEDURE
  2068.  PARSE ARG str
  2069.  return DataType(str, 'W')
  2070.  
  2071.  
  2072. /******************************** Makedir **********************************/
  2073.  
  2074. /* Makedir - If a directory under the given name already exists, or can be
  2075.    created, return 1, otherwise return 0. Though this function works
  2076.    correctly under Workbench 1.3, it has the same effect as the existing
  2077.    MAKEDIR; hence it is useful only under 2.0.
  2078. */
  2079. Makedir: procedure
  2080.  ds = statef(arg(1))
  2081.  if ds='' then
  2082.   result = 'MAKEDIR'(arg(1))
  2083.  else
  2084.   result = left(ds,3) = 'DIR'
  2085.  return result
  2086.  
  2087. Paternal: PROCEDURE EXPOSE person. AGdir flags. DoGenText PersonPrefix DBNAME DBPATH
  2088.  PARSE ARG irn, indent
  2089.  'GETPARENTS' irn
  2090.  PARENTS = RESULT
  2091.  'GETPRINCIPAL' PARENTS
  2092.  PRINCIPAL = RESULT
  2093.  'GETSPOUSE' PARENTS
  2094.  SPOUSE = RESULT
  2095. /* say 'PRINCIPAL = 'PRINCIPAL' SPOUSE = 'SPOUSE */
  2096.  'GETSEX' PRINCIPAL
  2097.  if RESULT = 'M' then do
  2098.   FIRN = PRINCIPAL
  2099.   MIRN = SPOUSE
  2100.   end
  2101.  else do
  2102.   FIRN = SPOUSE
  2103.   MIRN = PRINCIPAL
  2104.   end
  2105.  pirn = FIRN
  2106.  if 't'pirn't' ~= 'tt' then do
  2107.   Paternal(pirn,indent'    ')
  2108.   PersOutputCh(indent' ,-',0)
  2109.   if pirnLASTNAME ~= "" then PersOutputCh('<'pirn'>',1)
  2110.   if EXISTS(DBPATH'PN'pirn'.'DBNAME) then PersOutputCh(' (¶)',0)
  2111.   if EXISTS(DBPATH'PP'pirn'.'DBNAME) then PersOutputCh(' (®)',0)
  2112.   BirthDeath(pirn)
  2113.   PersOutputCr()
  2114.   Maternal(pirn,indent'|   ')
  2115.   end
  2116.  return 0
  2117.  
  2118. Maternal: PROCEDURE EXPOSE person. AGdir flags. DoGenText PersonPrefix DBNAME DBPATH
  2119.  PARSE ARG irn, indent
  2120.  'GETPARENTS' irn
  2121.  PARENTS = RESULT
  2122.  'GETPRINCIPAL' PARENTS
  2123.  PRINCIPAL = RESULT
  2124.  'GETSPOUSE' PARENTS
  2125.  SPOUSE = RESULT
  2126.  'GETSEX' PRINCIPAL
  2127.  if RESULT = 'M' then do
  2128.   FIRN = PRINCIPAL
  2129.   MIRN = SPOUSE
  2130.   end
  2131.  else do
  2132.   FIRN = SPOUSE
  2133.   MIRN = PRINCIPAL
  2134.   end
  2135.  pirn = MIRN
  2136.  if 't'pirn't' ~= 'tt' then do
  2137.   Paternal(pirn,indent'|   ')
  2138.   PersOutputCh(indent' `-',0)
  2139.   if pirnLASTNAME ~= "" then PersOutputCh('<'pirn'>',1)
  2140.   if EXISTS(DBPATH'PN'pirn'.'DBNAME) then PersOutputCh(' (¶)',0)
  2141.   if EXISTS(DBPATH'PP'pirn'.'DBNAME) then PersOutputCh(' (®)',0)
  2142.   BirthDeath(pirn)
  2143.   PersOutputCr()
  2144.   Maternal(pirn,indent'    ')
  2145.   end
  2146.  return 0
  2147.  
  2148. marriagesANDchildren: PROCEDURE EXPOSE person. AGdir flags. DoGenText PersonPrefix DBNAME DBPATH
  2149.         PARSE ARG ScionIRN,indent
  2150.  'GETNUMMARRY' ScionIRN
  2151.  TOTMARRIAGES = RESULT
  2152. /* say 'TOTMARRIAGES = 'TOTMARRIAGES */
  2153.  
  2154.  if 't'TOTMARRIAGES't' = 'tt' then return 0
  2155.  
  2156.  DO i = 0 TO TOTMARRIAGES - 1
  2157.   'GETMARRIAGE' ScionIRN i
  2158.   MARRIAGE = RESULT
  2159.   if MARRIAGE > -1 then do
  2160.    MARRIAGES = i
  2161.    end
  2162.  end
  2163.  tMARRIAGESt = 't'MARRIAGES't'
  2164. /* Say 'MARRIAGES = 'MARRIAGES tMARRIAGESt */
  2165.  
  2166.  if tMARRIAGESt ~= 'tMARRIAGESt' then do
  2167.   DO i = 0 TO MARRIAGES
  2168.    'GETMARRIAGE' ScionIRN i
  2169.    mFGRN = RESULT
  2170.    if mFGRN ~= "" then do
  2171.     'GETSPOUSE' mFGRN
  2172.     SPOUSE = RESULT
  2173.     if SPOUSE = ScionIRN then
  2174.      DO
  2175.      'GETPRINCIPAL' mFGRN
  2176.      SPOUSE = RESULT
  2177.      end
  2178.     PersOutputCh(indent' & ',0)
  2179.     mindent = "  "
  2180.     if i <= ( MARRIAGES - 1 ) then mindent = " :"
  2181.     PersOutputCh('<'SPOUSE'>',1)
  2182. if EXISTS(DBPATH'PN'SPOUSE'.'DBNAME) then PersOutputCh(' (¶)',0)
  2183. if EXISTS(DBPATH'PP'SPOUSE'.'DBNAME) then PersOutputCh(' (®)',0)
  2184.     BirthDeath(SPOUSE)
  2185.     PersOutputCr()
  2186.     'GETNUMCHILD' mFGRN
  2187.     TOTCHILDREN = RESULT
  2188. /* say 'TOTCHILDREN = 'TOTCHILDREN */
  2189.     DO k = 0 TO TOTCHILDREN - 1
  2190.      'GETCHILD' mFGRN k
  2191.      mFGRNc = RESULT
  2192.      GetPerComp(mFGRNc)
  2193.      if k = ( TOTCHILDREN - 1 ) then do
  2194.       indent2 = indent||mindent" "
  2195.       PersOutputCh(indent||mindent'|_<'mFGRNc'>',1)
  2196.       end
  2197.      else do
  2198.       indent2 = indent||mindent"|"
  2199.       PersOutputCh(indent2'_<'mFGRNc'>',1)
  2200.       end
  2201. if EXISTS(DBPATH'PN'mFGRNc'.'DBNAME) then PersOutputCh(' (¶)',0)
  2202. if EXISTS(DBPATH'PP'mFGRNc'.'DBNAME) then PersOutputCh(' (®)',0)
  2203.      BirthDeath(mFGRNc)
  2204.      PersOutputCr()
  2205.  
  2206.      marriagesANDchildren(mFGRNc,indent2)
  2207.      end
  2208.     end
  2209.    end
  2210.   end
  2211.  return 0
  2212.  
  2213. PersOutputHL: PROCEDURE EXPOSE person. DoGenText flags.
  2214.  WriteLn('PERSONFILE','<HR>')
  2215.  if flags.MakeGuide then WriteLn('PERSONGuide','')
  2216.  if DoGenText then do
  2217.    WriteLn('GenealogyText','')
  2218.    WriteLn('GenealogyText','-----------------------------------------------------------')
  2219.    WriteLn('GenealogyText','')
  2220.    end
  2221.  return 0
  2222.  
  2223. BirthDeath: PROCEDURE EXPOSE person. DoGenText flags.
  2224.  irn = arg(1)
  2225.  if ( flags.living > 0 ) & ( person.GETDEATHDATE.irn = "" ) then return 0
  2226. /* GetPerComp(irn) */
  2227.  if person.gotten.irn = PERSON.GOTTEN. then return 0
  2228.  if person.GETBIRTHDATE.irn ~= "" then
  2229.   PersOutputCh('   * 'person.GETBIRTHDATE.irn,0)
  2230.  if person.GETDEATHDATE.irn ~= "" & person.GETDEATHDATE.irn ~= "?" then
  2231.   PersOutputCh('   + 'person.GETDEATHDATE.irn,0)
  2232.  return 0
  2233.  
  2234. PersOutputCr: PROCEDURE EXPOSE person. DoGenText flags.
  2235.  WriteLn('PERSONFILE','')
  2236.  if flags.MakeGuide then WriteLn('PERSONGuide','')
  2237.  if DoGenText then WriteLn('GenealogyText','')
  2238.  return 0
  2239.  
  2240. PersOutputCh: PROCEDURE EXPOSE person. AGdir DoGenText flags. PersonPrefix LastNameFl LastNameVal
  2241.  if arg(1) ~= "" then do
  2242.   if arg(2) = 0 then do
  2243.    WriteCh('PERSONFILE',arg(1))
  2244.    if flags.MakeGuide then do
  2245.     if arg(1) = ' ('flags.htmlb'®'flags.htmlub')' then WriteCh('PERSONGuide',' (®)')
  2246.     else WriteCh('PERSONGuide',arg(1))
  2247.     end
  2248.    if DoGenText then WriteCh('GenealogyText',arg(1))
  2249.    end
  2250.   else do
  2251.    WriteCh('PERSONFILE',CheckForReplacement(arg(1)))
  2252.    if flags.MakeGuide then WriteCh('PERSONGuide',CheckGuideRepl(arg(1)))
  2253.    if DoGenText then WriteCh('GenealogyText',CheckForNAReplacement(arg(1)))
  2254.    end
  2255.  end
  2256.  return 0
  2257.  
  2258. PersOutputLn: PROCEDURE EXPOSE person. AGdir DoGenText flags. PersonPrefix LastNameFl LastNameVal
  2259.  if arg(1) ~= "" then do
  2260.   if arg(2) = 0 then do
  2261.    WriteLn('PERSONFILE',arg(1))
  2262.    if flags.MakeGuide then WriteLn('PERSONGuide',arg(1))
  2263.    if DoGenText then WriteLn('GenealogyText',arg(1))
  2264.    end
  2265.   else do
  2266.    WriteLn('PERSONFILE',CheckForReplacement(arg(1)))
  2267.    if flags.MakeGuide then WriteLn('PERSONGuide',CheckGuideRepl(arg(1)))
  2268.    if DoGenText then WriteLn('GenealogyText',CheckForNAReplacement(arg(1)))
  2269.    end
  2270.  end
  2271.  return 0
  2272.  
  2273. GeneaOutputCr: PROCEDURE EXPOSE person. flags.
  2274.  WriteLn('GenealogyFile','<BR>')
  2275.  if flags.MakeGuide then WriteLn('GenealogyGuide','') 
  2276.  return 0
  2277.  
  2278. GeneaOutputCh: PROCEDURE EXPOSE person. AGdir DoGenText flags. PersonPrefix LastNameFl LastNameVal
  2279.  if arg(1) ~= "" then do
  2280.   if arg(2) = 0 then do
  2281.    WriteCh('GenealogyFile',arg(1))
  2282.    if substr(arg(1),1,2) ~= '  ' then WriteCh('GenealogyFite',arg(1))
  2283.    if flags.MakeGuide then WriteCh('GenealogyGuide',arg(1))
  2284.    end
  2285.   else do
  2286.    WriteCh('GenealogyFile',CheckForReplacement(arg(1)))
  2287.    WriteCh('GenealogyFite',CheckForReplacement(arg(1)))
  2288.    if flags.MakeGuide then WriteCh('GenealogyGuide',CheckGuideRepl(arg(1)))
  2289.    end
  2290.  end
  2291.  return 0
  2292.  
  2293. GeneaOutputLn: PROCEDURE EXPOSE person. AGdir DoGenText flags. PersonPrefix LastNameFl LastNameVal
  2294.  if arg(1) ~= "" then do
  2295.   if arg(2) = 0 then do
  2296.    WriteLn('GenealogyFile',arg(1))
  2297.    WriteLn('GenealogyFite',arg(1))
  2298.    WriteLn('GenealogyGuide',arg(1))
  2299.    end
  2300.   else do
  2301.    WriteLn('GenealogyFile',CheckForReplacement(arg(1)))
  2302.    WriteLn('GenealogyFite',CheckForReplacement(arg(1)))
  2303.    WriteLn('GenealogyGuide',CheckGuideRepl(arg(1)))
  2304.    end
  2305.  end
  2306.  return 0
  2307.  
  2308. TagStrip: PROCEDURE
  2309.  PARSE ARG line
  2310.  line = strip(line,'b','<tt>')
  2311.  line = strip(line,'b','</tt>')
  2312.  line = strip(line,'b','<pre>')
  2313.  line = strip(line,'b','</pre>')
  2314.  line = strip(line,'b','<p>')
  2315.  line = strip(line,'b','</p>')
  2316.  return line
  2317.  
  2318. /***************************************************************
  2319. * Check for "<IRN>" and replace with Person Name (with anchor) *
  2320. ***************************************************************/
  2321.  
  2322. CheckForReplacement: PROCEDURE EXPOSE person. flags. PersonPrefix LastNameFl LastNameVal
  2323.  PARSE ARG line "<" last
  2324.  if last = "" then return line
  2325.  RIRN = GetRIRN(last".")
  2326.  if RIRN = 0 then return line"<"last
  2327.  last = CheckforReplacement(last)
  2328.  lastend = GetEnd(last".")
  2329.  GetPerComp(RIRN)
  2330.  if ( flags.living > 0 ) & ( person.GETDEATHDATE.RIRN = "" ) then
  2331.   return line'Living...'lastend
  2332.  RIRNFILENAME = PersonPrefix || RIRN
  2333.  if flags.bold then return line'<A HREF="'RIRNFILENAME'.htm">'person.GETFULLNAME.RIRN'</A>'lastend
  2334.  if LastNameFl = -1 & person.GETLASTNAME.RIRN = LastNameVal then do
  2335.   if person.GETSEX.RIRN = "M" then
  2336.    RIRNFULLNAME = ''flags.htmlb''person.GETFIRSTNAME.RIRN''flags.htmlub''
  2337.   else RIRNFULLNAME = ''flags.htmli''person.GETFIRSTNAME.RIRN''flags.htmlui''
  2338.   end
  2339.  else do
  2340.   if person.GETSEX.RIRN = "M" then
  2341.    RIRNFULLNAME = ''flags.htmlb''person.GETFULLNAME.RIRN''flags.htmlub''
  2342.   else RIRNFULLNAME = ''flags.htmli''person.GETFULLNAME.RIRN''flags.htmlui''
  2343.   end
  2344.  return line'<A HREF="'RIRNFILENAME'.htm">'RIRNFULLNAME'</A>'lastend
  2345.  
  2346. /******************************************************************
  2347. * Check for "<IRN>" and replace with Person Name (without anchor) *
  2348. ******************************************************************/
  2349.  
  2350. CheckForNAReplacement: PROCEDURE EXPOSE person. flags. PersonPrefix LastNameFl LastNameVal
  2351.  PARSE ARG line "<" last
  2352.  if last = "" then return line
  2353. /* if last = "" then return line */
  2354.  RIRN = GetRIRN(last".")
  2355.  if RIRN = 0 then return line"<"last
  2356.  last = CheckForNAReplacement(last)
  2357.  lastend = GetEnd(last".")
  2358.  GetPerComp(RIRN)
  2359.  if ( flags.living > 0 ) & ( person.GETDEATHDATE.RIRN = "" ) then
  2360.   return line'Living...'lastend
  2361.  if ~flags.bold then do
  2362.   if LastNameFl = -1 & person.GETLASTNAME.RIRN = LastNameVal then do
  2363.    if person.GETSEX.RIRN = "M" then
  2364.     RIRNFULLNAME = ''person.GETFIRSTNAME.RIRN''
  2365.    else
  2366.     RIRNFULLNAME = ''person.GETFIRSTNAME.RIRN''
  2367.    return line||RIRNFULLNAME lastend
  2368.    end
  2369.   else do
  2370.    if person.GETSEX.RIRN = "M" then
  2371.     RIRNFULLNAME = ''person.GETFULLNAME.RIRN''
  2372.    else
  2373.     RIRNFULLNAME = ''person.GETFULLNAME.RIRN''
  2374.    return line || RIRNFULLNAME lastend
  2375.    end
  2376.   end
  2377.  else do
  2378.   if LastNameFl = -1 & person.GETLASTNAME.RIRN = LastNameVal then
  2379.    RIRNFULLNAME = person.GETFIRSTNAME.RIRN
  2380.   else RIRNFULLNAME = person.GETFULLNAME.RIRN
  2381.   return line||RIRNFULLNAME lastend
  2382.   end
  2383.  
  2384. /****************************************************************
  2385. * Check for "<IRN>" and replace with Person Name (Guide anchor) *
  2386. ****************************************************************/
  2387.  
  2388. CheckGuideRepl: PROCEDURE EXPOSE AGdir person. flags. PersonPrefix LastNameFl LastNameVal
  2389.  PARSE ARG line "<" last
  2390.  if last = "" then return line
  2391.  RIRN = GetRIRN(last".")
  2392.  if RIRN = 0 then return line"<"last
  2393.  last = CheckGuideRepl(last)
  2394.  lastend = GetEnd(last".")
  2395.  GetPerComp(RIRN)
  2396.  if ( flags.living > 0 ) & ( person.GETDEATHDATE.RIRN = "" ) then
  2397.   return line'Living...'lastend
  2398.  RIRNFILENAME = PersonPrefix || RIRN
  2399.  if LastNameFl = -1 & person.GETLASTNAME.RIRN = LastNameVal then 
  2400.   RIRNFULLNAME = person.GETFIRSTNAME.RIRN
  2401.  else RIRNFULLNAME = person.GETFULLNAME.RIRN
  2402.  if flags.bold then 
  2403.   return line'@{" 'RIRNFULLNAME' " LINK 'AGdir'/'RIRNFILENAME'.guide/Main}'lastend
  2404.  thegender = 'i'
  2405.  if person.GETSEX.RIRN = "M" then thegender = 'b'
  2406.  return line'@{" " LINK 'AGdir'/'RIRNFILENAME'.guide/Main}@{'thegender'}'RIRNFULLNAME'@{u'thegender'}'lastend
  2407.  
  2408. GetRIRN: PROCEDURE
  2409.  PARSE ARG numb ">" last
  2410.  if last = "" then return 0
  2411.  if IsNumeric(numb) then return numb
  2412.  return 0
  2413.  
  2414. GetEnd: PROCEDURE
  2415.  PARSE ARG line ">" last
  2416.  if last = "" then return substr(line,1,length(line)-1)
  2417.  return substr(last,1,length(last)-1)
  2418.  
  2419. GetLength: PROCEDURE
  2420.  PARSE UPPER ARG names
  2421.  nonletters = length(compress(names, xrange('A','Z')))
  2422.  return Length(names) - nonletters * 4 / 10
  2423.  
  2424.  
  2425. /* create a full name from first, last, and honorifics parts */
  2426.  
  2427. GetFullName: PROCEDURE EXPOSE person. thelastname
  2428.  PARSE ARG firstnames "," hon
  2429.  if hon = "" then do
  2430.   if length(firstnames) > 2 then
  2431.    if substr(firstnames,length(firstnames)-1,length(firstnames)) = "V." then
  2432.     firstnames = substr(firstnames,1,length(firstnames)-2)"v."
  2433.   return firstnames thelastname
  2434.   end
  2435.  return firstnames Space(thelastname)","hon
  2436.  
  2437. MGetFullName: PROCEDURE EXPOSE person. flags. thelastname thegender
  2438.  PARSE ARG firstnames "," hon
  2439.  if flags.bold then return firstnames Space(thelastname)
  2440.  gchar = "B"
  2441.  if thegender = "f" then gchar = "I"
  2442.  if hon = "" then do
  2443.   if length(firstnames) > 2 then
  2444.    if substr(firstnames,length(firstnames)-1,length(firstnames)) = "V." then
  2445.     firstnames = substr(firstnames,1,length(firstnames)-2)"v."
  2446.   return "<"gchar">"firstnames thelastname"</"gchar">"
  2447.   end
  2448.  return "<"gchar">"firstnames Space(thelastname)","hon"</"gchar">"
  2449.  
  2450. PGetFullName: PROCEDURE EXPOSE person. flags. thelastname thegender
  2451.  PARSE ARG firstnames "," hon
  2452.  if flags.bold then return firstnames Space(thelastname)
  2453.  schar = "1"
  2454.  uchar = "2"
  2455.  if thegender = "f" then do
  2456.   schar = "3"
  2457.   uchar = "3"
  2458.   end
  2459.  if hon = "" then do
  2460.   if length(firstnames) > 2 then
  2461.    if substr(firstnames,length(firstnames)-1,length(firstnames)) = "V." then
  2462.     firstnames = substr(firstnames,1,length(firstnames)-2)"v."
  2463.   return ""schar"m"firstnames thelastname""uchar"m"
  2464.   end
  2465.  return ""schar"m"firstnames Space(thelastname)","hon""uchar"m"
  2466.  
  2467. AgeTest: PROCEDURE EXPOSE flags.
  2468.  PARSE ARG DBFile, HTMFile
  2469.  if Exists(DBFile) then do
  2470.   if Exists(HTMFile) then do
  2471. Parse value StateF(DBFile) with type size blk bits DBday DBmin DBtick com
  2472. Parse value StateF(HTMFile) with type size blk bits HTMday HTMmin HTMtick com
  2473. /* Say DBFile DBday DBmin DBtick  HTMFile HTMday HTMmin HTMtick */
  2474.    if ( DBday > HTMday ) | ( DBday = HTMday & DBmin > HTMmin ) then do
  2475.     Delete(HTMFile)
  2476.     Say DBFile 'is newer; removing 'HTMFile
  2477.     return 1
  2478.     end
  2479.    else do
  2480.     if flags.verbose then Say '  ~ 'HTMFile'  ...OK... '
  2481.     return 0
  2482.     end
  2483.   return 1
  2484.   end
  2485.  return 1
  2486.  end
  2487.  
  2488. CheckPathName: PROCEDURE
  2489. PARSE ARG str
  2490. /* Check if path ends with a ":". If not, append a "/" */
  2491. lastchar = right(str,1)
  2492. if right(str,1) ~= ":" & right(str,1) ~= "/" then return str'/'
  2493. return str
  2494.  
  2495. AskExit: PROCEDURE
  2496.  SAY '                 '
  2497.  SAY '===> press RETURN to exit...'
  2498.  SAY ' '
  2499.  PULL target
  2500.  PauseExit()
  2501.  end
  2502.  
  2503. PauseExit: PROCEDURE
  2504.  SAY ' '
  2505.  SAY '    \                   /'
  2506.  SAY '     \                 / '
  2507.  SAY '                         '
  2508.  SAY '                         '
  2509.  SAY '       Scion2html.rexx   '
  2510.  SAY '                         '
  2511.  SAY '              ©          '
  2512.  SAY '                         '
  2513.  SAY '        Harold Ipolyi    '
  2514.  SAY '                         '
  2515.  SAY '                         '
  2516.  SAY '     /                 \ '
  2517.  SAY '    /                   \'
  2518.  SAY ' '
  2519.  EXIT
  2520.  end
  2521.  
  2522. CheckGfxCon: PROCEDURE
  2523. DoPictures = EXISTS("Sys:Tools/GfxCon")
  2524.  
  2525. if ~DoPictures then do
  2526.  SAY ' '
  2527.  say 'GfxCon not found in Sys:Tools - unable to include inline pictures in HTMLs'
  2528.  end
  2529. return DoPictures
  2530.  
  2531. Validtarget: PROCEDURE
  2532.  PARSE UPPER ARG str
  2533.  tval = substr(str,1,1)
  2534.  if verify(' BCDEFGIJKLMOPRSTUVWXYZ.,<>-=\|+_)(*&^%$@!~[]{}`',tval,m) > 1 then
  2535.   return 0
  2536.  return 1
  2537.  
  2538.  
  2539. GetPerComp: PROCEDURE EXPOSE person. flags.
  2540.  PARSE ARG irn
  2541.  if irn = '' then return ""
  2542.  
  2543.  if ~person.gotten.irn then do
  2544.   person.gotten.irn = 1
  2545.  
  2546. /* name */
  2547.   'GETFIRSTNAME' irn
  2548.   person.GETFIRSTNAME.irn = RESULT
  2549.   'GETLASTNAME' irn
  2550.   person.GETLASTNAME.irn = RESULT
  2551.   thelastname = GetLastName(person.GETLASTNAME.irn)
  2552. /* requires `thelastname' above */
  2553.   person.GETFULLNAME.irn = GetFullName(person.GETFIRSTNAME.irn)
  2554. /* gender */
  2555.   'GETSEX' irn
  2556.   person.GETSEX.irn = RESULT
  2557.   thegender = GETSEX.irn
  2558. /* special names; requires `thegender' above */
  2559.   person.MGETFULLNAME.irn = MGetFullName(person.GETFIRSTNAME.irn)
  2560.   person.PGETFULLNAME.irn = PGetFullName(person.GETFIRSTNAME.irn)
  2561. /* dates */
  2562.   'GETBIRTHDATE' irn
  2563.   person.GETBIRTHDATE.irn = RESULT
  2564.   'GETDEATHDATE' irn
  2565.   person.GETDEATHDATE.irn = RESULT
  2566. /* places */
  2567.   'GETBIRTHPLACE' irn
  2568.   person.GETBIRTHPLACE.irn = RESULT
  2569.   'GETDEATHPLACE' irn
  2570.   person.GETDEATHPLACE.irn = RESULT
  2571.   end
  2572.  return 0 
  2573.  
  2574. askliving: PROCEDURE
  2575.  answer = ""
  2576.  say ' '
  2577.  call writech(stdout,'          Exclude info about living persons? [y] ')
  2578.  PULL answer
  2579.  if Upper(substr(answer,1,1)) = 'N' then return 0
  2580.  if Upper(substr(answer,1,1)) = 'Q' then AskExit()
  2581.  return 2
  2582.  
  2583.  
  2584.  /* Capitalize last name; also handle special cases! */
  2585.  /* End users may wish to customize this code */
  2586.  
  2587. GetLastName: PROCEDURE
  2588.  
  2589. /* to use last names as is in data base, uncomment the following 2 lines: */
  2590. /* PARSE ARG str */
  2591. /* return str    */
  2592.  
  2593.  PARSE upper ARG str
  2594.  if str = "BAUER-GAUSS" then return "Bauer-Gauss"
  2595.  if ( str = "DE IPOLYI" ) | ( str = "DEIPOLYI" ) then return "deIpolyi"
  2596.  if str = "MC GRADY" then return "McGrady"
  2597.  if str = "MCFEE" then return "McFee"
  2598.  if str = "KIS RED" then return "KisRed"
  2599.  if str = "ROTH-HACKENSCHMIDT" then return "Roth-Hackenschmidt"
  2600.  if str = "SCHüCH-GLICKHFELDEN" then return "Schüch-Glickhfelden"
  2601.  if str = "VONRUDERFRUD" then return "Von Ruderfrud"
  2602.  if str = "VONHARBEN" then return "Von Harben"
  2603.  else
  2604.   DO
  2605.   spart = translate(substr(str,2,length(str)),xrange('a','z'),xrange('A','Z'))
  2606.   end
  2607.  return substr(str,1,1)Space(spart)
  2608.  
  2609.